Какие символы мне нужно экранировать в документах XML?
Какие символы необходимо экранировать в XML-документах или где найти такой список?
9 ответов
Если вы используете соответствующий класс или библиотеку, они сделают экранирование за вас. Многие проблемы XML вызваны объединением строк.
Escape-символы XML
Экранирование символов зависит от того, где используется специальный символ.
Текст
Атрибуты
Символ ‘ не нужно экранировать в атрибутах, если кавычки имеют вид » :
Аналогично, » не нужно экранировать в атрибутах, если кавычки имеют вид ‘ :
Комментарии
Все пять специальных символов нельзя экранировать в комментариях:
CDATA
Все пять специальных символов нельзя экранировать в разделах CDATA:
Инструкции по обработке
Все пять специальных символов нельзя экранировать в инструкциях по обработке XML:
XML против HTML
HTML имеет собственный набор управляющих кодов, охватывающий гораздо больше символов.
Согласно спецификациям Консорциума World Wide Web (w3C), состоит из 5 символов. которые не должны появляться в своей буквальной форме в XML-документе, за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. Во всех остальных случаях эти символы должны быть заменены либо на соответствующий объект, либо на числовую ссылку в соответствии со следующей таблицей:
Исходный символ Замена объекта XML Числовая замена XML
& lt; & # 60;
> & gt; & # 62;
» & quot; & # 34;
& & amp; & # 38;
‘ & apos; & # 39;
Для тегов и атрибутов экранирующие символы различаются.
Символ амперсанда (&) и левая угловая скобка ( ) может быть представлена с помощью строки «>» и должна, для совместимости, экранироваться с помощью символа «>» или ссылки на символ, когда она появляется в строке «]]>» в содержимом, когда это строка не отмечает конец раздела CDATA.
Чтобы значения атрибутов могли содержать как одинарные, так и двойные кавычки, апостроф или символ одинарной кавычки (‘) можно представить как «‘», а символ двойной кавычки («) как» «».
Есть пять предопределенных сущностей:
«Все разрешенные символы Unicode могут быть представлены с помощью числовой ссылки на символы». Например:
Большинство управляющих символов и других диапазонов Unicode специально исключены, что означает (я думаю), что они не могут появляться ни в экранировании, ни в прямом:
Это зависит от контекста. Для содержания это (хотя строка из трех вместо одного символа).
Принятый ответ неверен. Лучше всего использовать библиотеку для экранирования xml.
Как упоминалось в этом другом вопросе
«В основном, управляющие символы и символы вне диапазонов Unicode не допускаются. Это также означает, что вызов, например, символьной сущности запрещен».
Если вы избежите только пяти символов. У вас могут быть такие проблемы, как Обнаружен недопустимый символ XML (Unicode: 0xc)
Только и & требуется экранировать, если они обрабатываются символьными данными, а не разметкой:
Возможно, это поможет:
В документах SGML, HTML и XML логические конструкции, известные как символьные данные и значения атрибутов, состоят из последовательностей символов, в которых каждый символ может проявляться напрямую (представляя себя) или может быть представлен серией символов, называемой ссылкой на символ, из которых есть два типа: числовая символьная ссылка и символьная ссылка на сущность. В этой статье перечислены ссылки на символьные сущности, которые действительны в документах HTML и XML.
В этой статье перечислены следующие пять предопределенных XML-сущностей:
Правила синтаксиса XML
Правила синтаксиса XML крайне просты и логичны. Их легко запомнить и легко использовать.
Все XML элементы должны иметь закрывающий тег
В HTML некоторые элементы могут не иметь закрывающего тега:
В XML нельзя опускать закрывающий тег. Абсолютно все элементы должны закрываться:
Возможно, вы заметили из предыдущих примеров, что XML декларация не имеет закрывающего тега. Это не ошибка. Дело в том, что декларация не относится к XML документу, поэтому у нее и нет закрывающего тега.
Теги XML регистрозависимы
Открывающий и закрывающий теги должны определяться в одном регистре:
Замечание: «Открывающий и закрывающий теги» иногда еще называют «начальный и конечный теги». Используйте то определение, которое вам более симпатично. По сути это одно и то же.
XML элементы должны соблюдать корректную вложенность
В HTML иногда можно наблюдать такую картину:
и иногда это даже работает должным образом.
В XML все элементы обязаны соблюдать корректную вложенность:
Понятие «корректная вложенность» по отношению к приведенным примерам просто означает, что так как элемент открывается внутри элемента , то и закрываться он должен внутри элемента .
У XML документа должен быть корневой элемент
XML документ должен содержать один элемент, который будет родительским для всех других элементов. Он называется корневым элементом.
XML пролог
Следующая строка называется XML прологом:
XML пролог необязателен. Но если он есть, то это должна быть первая строка XML документа.
В XML документе могут присутствовать международные символы, вроде русских букв, и чтобы не возникало ошибок необходимо указать кодировку, либо сохранить XML файл в формате UTF-8.
UTF-8 — кодировка XML документов по умолчанию.
Значения XML атрибутов должны заключаться в кавычки
Так же, как и в HTML, у XML элементов могут быть атрибуты в виде пары имя/значение.
В XML значения атрибутов должны заключаться в кавычки.
Посмотрите на следующие два примера XML документа. Первый с ошибкой, второй написан правильно:
Ошибка в первом XML документе заключается в том, что значение атрибута date элемента note не заключено в кавычки.
Сущности
Некоторые символы в XML имеют особые значения.
Если вы поместите, например, символ «
Замечание: Только символы » » допустим, но лучше его всегда заменять на сущность.
Комментарии в XML
Синтаксис комментариев в XML такой же, как и в HTML.
Использование двух символов тире в середине комментария не допустимо.
Странно, но так можно:
В XML пробелы сохраняются
В HTML несколько последовательных пробельных символов усекаются до одного. В XML документе все пробельные символы сохраняются.
В XML новая строка сохраняется как LF
В приложениях Windows новая строка хранится в следующем виде: символ перевода каретки и символ новой строки (CR+LF).
Unix и Mac OSX используют LF.
Старые Mac системы используют CR.
XML сохраняет новую строку как LF.
Синтаксически верный XML документ
Если XML документ составлен в соответствии с приведенными синтаксическими правилами, то говорят, что это «синтаксически верный» XML документ.
Недопустимые символы и правила экранирования
В данном разделе описана обработка недопустимых символов XML при помощи предложения FOR XML и перечислены правила экранирования для символов, недопустимых в XML-именах.
Предложение FOR XML и недопустимые символы
SQL Server преобразует недопустимые XML-символы в сущности, когда они возвращаются в запросах FOR XML, не содержащих директивы TYPE.
Хотя синтаксические анализаторы, следующие стандарту XML 1.0, будут выводить ошибку независимо от того, преобразованы ли такие символы в сущности, это поведение более соответствует XML 1.1. Представление таких символов в виде сущностей также может оказаться более согласованным с будущими версиями стандарта XML. Кроме того, таким образом упрощается отладка, так как становится виден элемент кода, содержащий недопустимый символ.
Пользователям инструментов XML не требуется делать никаких обновлений, так как анализатор XML в любом случае выдаст ошибку, встретив в потоке данных недопустимый символ. При использовании других инструментов это изменение может потребовать обновления программной логики для поиска таких символов в виде сущностей.
Следующие символы пробела в результатах запросов FOR XML преобразуются в сущности иным образом с целью их сохранения для обратных преобразований.
В содержимом и атрибутах элементов: hex(0D) (возврат каретки)
В содержимом атрибутов: hex(09) (табуляция), hex(0A) (перевод строки)
Данные символы сохраняются в выходе, и средство синтаксического анализа не выполняет их нормализацию.
Правила экранирования
Есть только два небуквенных символа, которые могут встречаться в имени XML: двоеточие (:) и подчеркивание (_). Так как двоеточие уже зарезервировано для пространств имен, в качестве escape-символа используется подчеркивание. Далее перечислены правила кодирования недопустимых символов.
Все символы UCS-2, которые не могут входить имена XML в соответствии со стандартом XML 1.0, экранируются как _xHHHH_. Здесь сочетание HHHH будет замещено на четырехразрядный шестнадцатеричный код символа в UCS-2, где самым старшим является первый разряд. Например, имя таблицы Order Details будет закодировано как Order_x0020_Details.
Символы, не входящие в диапазон UCS-2 (дополнения UCS-4 в диапазоне от U+00010000 до U+0010FFFF), кодируются как _xHHHHHHHH_. Здесь сочетание HHHHHHHH будет замещено на восьмиразрядный шестнадцатеричный код символа в UCS-4, если используется режим обратной совместимости с SQL Server 2000. В иных случаях символы кодируются как _xHHHHHH_в целях соответствия стандарту ISO.
Символ нижнего подчеркивания не нуждается в экранировании, если за ним не следует символ x. Например, имя таблицы Данные заказа не будет закодировано.
Двоеточие в идентификаторах не кодируется. Поэтому запрос FOR XML может формировать элемент пространства имени и имена атрибутов. Например, следующий запрос формирует атрибут пространства имен с двоеточием в имени:
Результат этого запроса будет таким:
Обратите внимание, что для добавления пространств имен XML рекомендуется использовать предложение WITH XMLNAMESPACES.
I. Коротко об XML¶
Введение в XML¶
XML ( англ. eXtensible Markup Language) — расширяемый язык разметки, предназначенный для хранения и передачи данных.
Простейший XML-документ выглядит следующим образом:
Документ XML состоит из элементов (elements). Элемент начинается открывающим тегом (start-tag) в угловых скобках, затем идет содержимое (content) элемента, после него записывается закрывающий тег (end-teg) в угловых скобках.
Некоторые элементы, не содержащие значений, допустимо записывать без закрывающего тега. В таком случае символ / ставится в конце открывающего тега:
Структура XML¶
XML документ должен содержать корневой элемент. Этот элемент является «родительским» для всех других элементов.
Все элементы в XML документе формируют иерархическое дерево. Это дерево начинается с корневого элемента и разветвляется на более низкие уровни элементов.
Все элементы могут иметь подэлементы (дочерние элементы):
Правила синтаксиса (Валидность)¶
Основные правила синтаксиса XML:
Открывающий и закрывающий теги должны определяться в одном регистре:
Сущности¶
Некоторые символы в XML имеют особые значения и являются служебными. Если вы поместите, например, символ внутри XML элемента, то будет сгенерирована ошибка, так как парсер интерпретирует его, как начало нового элемента.
Также ошибка будет сгенерирована и в слудющем примере, если название организации взять в обычные кавычки (английские двойные):
Чтобы ошибки не возникали, нужно заменить символ на его сущность. В XML существует 5 предопределенных сущностей:
| Сущность | Символ | Значение |
|---|---|---|
| меньше, чем | ||
| > | > | больше, чем |
| & | & | амперсанд |
| ‘ | ‘ | апостроф |
| « | « | кавычки |
Только символы и & строго запрещены в XML. Символ > допустим, но лучше его всегда заменять на сущность.
Таким образом, корректными будут следующие формы записей:
В последнем примере английские двойные кавычки заменены на французские кавычки («ёлочки»), которые не являются служебными символами.
Поиск информации в XML файлах (XPath)¶
XPath ( англ. XML Path Language) — язык запросов к элементам XML-документа. XPath расширяет возможности работы с XML.
XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция version=”1.0”?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.
Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам. Рассмотрим пример списка книг:
XPath запрос /bookstore/book/price вернет следующий результат:
Чтобы получить больше информации, необходимо модифицировать запрос //book[title[@lang=»it»]] вернет:
В приведенной ниже таблице представлены некоторые выражения XPath и результат их работы:
Кодировки¶
И еще один важный момент, который стоит рассмотреть — кодировки. Существует множество кодировок, о них подробнее можно прочитать в статье Набор символов.
В XML файле кодировка объявляется в декларации:
Часто можно столкнуться с ситуацией, когда текстовый редаткор некорректно распознает кодировку и отображает кракозябры. В такой случае, необходимо выбрать кодировку вручную, для этого выполните:
| Программа | Кодировка |
|---|---|
| Notepad++ | «Документ → Кодировка» |
| Geany | «Документ → Установить кодировку» |
| Firefox | «Вид → Кодировка» |
| Chrome | «Настройка → Дополнительные инструменты → Кодировка» |
Если ничего не помогает, вполне возможно, что файл был поврежден.
XSD схема¶
XML Schema — язык описания структуры XML-документа, его также называют XSD. Как большинство языков описания XML, XML Schema была задумана для определения правил, которым должен подчиняться документ. Но, в отличие от других языков, XML Schema была разработана так, чтобы её можно было использовать в создании программного обеспечения для обработки документов XML.
После проверки документа на соответствие XML Schema читающая программа может создать модель данных документа, которая включает:
Каждый элемент в этой модели ассоциируется с определённым типом данных, позволяя строить в памяти объект, соответствующий структуре XML-документа. Языкам объектно-ориентированного программирования гораздо легче иметь дело с таким объектом, чем с текстовым файлом.
Подробнее об XSD смотрите:
Примером использования XSD cхем может служить электронная отчетность:



