Java XMLStreamReader преобразуется в "

Предположим, у нас есть следующий XML

<Test> <Description> &quot;Hi&quot; </Description> </Test>

Я загружаю этот XML с помощью XMLStreamReader и анализирую с помощью объекта чтения. Когда я печатаю символы, встречающиеся при синтаксическом анализе с помощью getText() средства чтения, я вижу, что &quot; печатается как «. Хотя «(двойные кавычки) не обязательно должны быть экранированы в &quot; в первую очередь, я хотел бы чтобы узнать, почему синтаксический анализатор автоматически выполняет это преобразование, когда экранирование не требуется. Например, сохраняются &lt;, &gt; and &amp;, без которых результирующий XML был бы недействительным. Однако это не относится к &quot; and &apos;. Я должен сохранить описание так же, как я его получил. Можно ли это сделать с помощью XMLStreamReader API?


person kishore    schedule 26.04.2018    source источник
comment
Вам нужно использовать XMLStreamReader для разбора XML?   -  person Alberto    schedule 26.04.2018
comment
@Alberto Да, настоящий XML довольно большой, поэтому я не использую DOM.   -  person kishore    schedule 26.04.2018
comment
И вы получаете этот XML или генерируете его? Чтобы предотвратить экранирование специальных символов, эти данные должны быть помечены специальной меткой CDATA.   -  person Alberto    schedule 26.04.2018
comment
@Alberto Альберто Я получаю этот XML от клиента. Он не генерируется локально.   -  person kishore    schedule 26.04.2018
comment
С XMLStreamReader невозможно игнорировать escape-символы. Класс XMLStreamReaderImpl тоже. Вам потребуется найти реализацию, позволяющую указать, что вы не хотите убегать, или использовать другой способ сделать это.   -  person Alberto    schedule 26.04.2018


Ответы (1)


Я должен сохранить описание так же, как я его получил.

Ты не должен. Что касается XML, то &quot; и " — это одно и то же, и поэтому для вас не имеет значения, получите ли вы одно или другое.

Что касается того, почему это происходит, то работа синтаксического анализатора XML заключается в том, чтобы не экранировать экранированные символы, чтобы они представляли вам данные, которые они имеют в виду. Он также убирает &lt; и так далее. Однако, когда полученный таким образом текст затем сериализуется обратно в XML, сериализатор снова будет экранировать такие символы, как <, потому что это требуется XML, но он не будет беспокоиться об экранировании ", потому что это не обязательно.

Когда вы проходите процесс синтаксического анализа XML, а затем снова сериализуете, у вас не может быть концепции «сохранения» побегов как есть. Это по своей сути теряется при преобразовании. Парсер просто не отвечает за сохранение этой ненужной информации. Однако, если вы хотите, чтобы ваш " всегда экранировался в &quot; в результирующем XML, ваш XML-сериализатор может иметь для этого опцию (вы не предоставили подробностей о том, что вы используете, поэтому я не могу точно сказать, можете ли вы или нельзя)

person kumesana    schedule 26.04.2018
comment
Я понимаю, что экранирование не нужно, и полученный XML полностью действителен. Я должен удовлетворить вариант использования, который требует, чтобы данные хранились как есть. Единственный известный мне способ сделать это — попросить отправителя не сбегать, и для этого мне нужно было подтверждение. Так что, я думаю, я могу просто сделать этот вывод, верно? - person kishore; 26.04.2018
comment
Для компьютеров нет ничего невозможного, но если вы хотите сохранить экранированные символы, вам понадобится парсер XML, который предлагает это, что, скорее всего, означает создание его самостоятельно, что обычно считается неразумным шагом. Так что да, я бы предложил вместо этого либо отказаться от бесполезного требования о сохранении экранированных символов, либо сделать его более неуместным, не имея экранированных символов во входном документе, когда в их экранировании не было необходимости. - person kumesana; 26.04.2018