使用Stax,我很惊讶地发现了一个XML块,例如:
<badger>
<![CDATA[Text about a badger]]>
</badger>
被视为:
START_ELEMENT (badger)
CHARACTERS ( Text about a badger )
END_ELEMENT (badger)
即,将CDATA和周围文本展平为一个文本元素。没有检测到CDATA元素。
这是正确的行为吗?如何将空格与CDATA分开?
我正在使用woodstox实现。
答案 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有关类似问题的内容。)