Stax считает Text + CDATA + Text одним разделом CHARACTERS - PullRequest
1 голос
/ 05 декабря 2010

Используя Stax, я с удивлением обнаружил, что такой блок XML, как:

<badger>
    <![CDATA[Text about a badger]]>
</badger>

рассматривается как если бы это было:

START_ELEMENT (badger)
CHARACTERS (        Text about a badger    )
END_ELEMENT (badger)

То есть CDATA и окружающий текст сведены в один текстовый элемент. Элемент CDATA не обнаружен.

Это правильное поведение? Как я могу отделить пробел от CDATA?

Я использую реализацию woodstox.

Ответы [ 3 ]

3 голосов
/ 20 декабря 2010

Я подозреваю, что для свойства 'XMLInputFactory.IS_COALESCING' установлено значение true (или вы используете Woodstox 3.2, для которого он включен по умолчанию - что не является предложением по умолчанию для stax, то есть незначительной ошибкой). Это вызывает как преобразование CDATA в CHARACTERS, так и объединение смежных текстовых сегментов, если таковые имеются.

Кроме этого, Woodstox сообщает об отдельных разделах CDATA; но в спецификации Stax есть некоторые «интересные» требования для конвекции - членам экспертной группы, похоже, не нравится, что CDATA обрабатывается иначе, чем CHARACTERS.

Итак: если вы хотите, чтобы они сообщались отдельно, обязательно отключите IS_COALESCING:

inputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
3 голосов
/ 05 декабря 2010

CDATA не является элементом; это механизм экранирования, который сообщает парсеру XML не пытаться искать вложенные теги в этом разделе. Это полезно для текста, содержащего такие символы, как <и &, чтобы избежать утомительного экранирования их всех по отдельности или потому, что есть другая причина, по которой обычные escape-последовательности не будут работать. </p>

0 голосов
/ 05 декабря 2010

Я не знаю о реализации woodstox, но может ли эта ошибка , исправленная в 2006 году, все еще быть фактором? Вы устанавливаете необязательное свойство report-cdata-event ?

(См. Также это сообщение о аналогичной проблеме.)

...