Специальные символы в файлах XML - обработка с помощью DOM API - PullRequest
5 голосов
/ 16 мая 2009

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

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

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

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

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 16 мая 2009

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

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

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

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

<xml>17 < 20</xml>

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

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

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

{
  "xml": "17 < 20"
}

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

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

2 голосов
/ 16 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...