Stax认为Text + CDATA + Text是一个CHARACTERS部分

时间:2010-12-05 00:05:51

标签: java xml cdata stax woodstox

使用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 个答案:

答案 0 :(得分:3)

CDATA不是一个元素;它是一种逃避机制,告诉XML解析器不要在该部分中寻找嵌套标签。这对包含&lt;等字符的文本很有用。和&amp ;,以避免繁琐地单独逃避它们,或者因为还有其他原因导致正常的转义序列不起作用。

答案 1 :(得分:3)

我怀疑你将属性'XMLInputFactory.IS_COALESCING'设置为true(或者,正在使用默认启用它的Woodstox 3.2 - 这不是默认的stax规范建议,即是一个小错误)。这会强制将CDATA转换为CHARACTERS,并合并相邻的文本段(如果有的话)。

除此之外,Woodstox确实报告CDATA部分不同;但是Stax规范对于convesion有一些“有趣的”要求 - 专家组的成员似乎不喜欢CDATA与CHARACTERS处理不同的想法。

所以:如果你确实希望将它们分开报告,请确保禁用IS_COALESCING:

inputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);

答案 2 :(得分:0)

我不知道woodstox的实现,但2006年解决的this bug仍然是一个因素吗? 您是否设置了可选的report-cdata-event property

(另请参阅this message有关类似问题的内容。)