Специальные символы в XML-файлах — обработка с помощью DOM API

У меня есть файл в формате XML (состоит только из корневых начальных и конечных тегов и дочерних элементов корня). Текстовые элементы дочерних элементов содержат символ амперсанда &. В XML не разрешено иметь этот символ, чтобы документ был действительным, и когда я попытался обработать файл с помощью DOM API в Java и синтаксического анализатора XML, я получил ошибки синтаксического анализа. Поэтому я заменил & на & и успешно обработал файл: мне пришлось извлечь значения текстовых элементов в разные текстовые файлы.

Когда я открыл эти только что созданные текстовые файлы, я ожидал увидеть &, но вместо этого был &. Почему это? Я сохранил текст в текстовых файлах без какого-либо расширения (мой исходный файл с форматом XML также не имел расширения .xml), и у меня есть просто & в тексте нового файла, независимо от того, как я открываю файл: как txt или как файл xml (это некоторые параметры в моем редакторе XML). Что именно происходит? Преобразует ли Java (?) & в & автоматически? Или есть какая-то кодировка по умолчанию? Ну, & означает &, и я предполагаю, что есть какое-то «невидимое» автоматическое преобразование, но я не понимаю, когда и как это происходит. Вот примеры моего исходного файла и извлеченного файла, который я получаю после обработки исходного файла с помощью Java:

Это мой файл "negative.review" в формате XML:

<review>
<review_text>
I will not wear it as it is too big &amp; looks funny on me. 
</review_text>
</review>

Это мой извлеченный файл "negative_1":

I will not wear it as it is too big & looks funny on me. 

Для меня важно иметь исходные данные как есть (без каких-либо преобразований/замен), поэтому я подумал, что мне нужно обработать извлеченный файл "negative_1", преобразовав обратно &amp; в &. Как видите, кажется, мне не нужно этого делать. Но я не понимаю, почему :(.

Заранее спасибо!


person user42155    schedule 16.05.2009    source источник
comment
Просто замечание: состоит только из корневых начальных и конечных тегов и дочерних элементов корня. Это и есть определение XML (есть только один корневой элемент).   -  person PhiLho    schedule 16.05.2009
comment
stackoverflow.com/questions/4341145/   -  person sandeepKumar    schedule 16.07.2012


Ответы (2)


Причина проста: файл XML действительно содержит символ "&".

Он просто представлен по-другому (т. е. "экранирован"), потому что настоящий "&" сам по себе разбивает XML-файлы, как вы видели. Прочтите соответствующий раздел спецификации XML 1.0: "2.4 Символьные данные и разметка". Это всего несколько строк, но они довольно хорошо объясняют проблему.

XML — это представление данных (!). Не думайте об этом как о текстовом файле. Пример:

Вы хотите сохранить строку «17 ‹ 20» в файле XML. Изначально вы не можете, так как "‹" зарезервирован как скобка открывающего тега. Таким образом, это будет недействительным:

<xml>17 < 20</xml>

Решение: вы используете экранирование символов для специального/зарезервированного символа только для того, чтобы сохранить действительность файла:

<xml>17 &lt; 20</xml>

Для всех практических целей приведенный выше фрагмент содержит следующие данные (на этот раз в представлении JSON):

{
  "xml": "17 < 20"
}

Вот почему вы видите настоящее "&" в своей постобработке. Его экранировали таким же образом, но его значение все время оставалось неизменным.

Приведенный выше пример также объясняет, почему "&" нужно обрабатывать особым образом: он сам является частью механизма экранирования XML. Он отмечает начало управляющей последовательности, как в "&lt;". Поэтому его нужно экранировать (с помощью "&amp;", как вы это сделали).

person Tomalak    schedule 16.05.2009
comment
Потрясающий ответ... как обычно! +1 - person Cerebrus; 16.05.2009

Любой синтаксический анализатор XML будет неявно преобразовывать объекты, такие как &amp;, &lt;, &gt;, в соответствующие символы, как часть процесса анализа файла.

person Alex Martelli    schedule 16.05.2009