1

使用 Stax,我惊讶地发现一个 XML 块,例如:

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

被视为:

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

即,CDATA 和周围的文本被展平为一个文本元素。未检测到 CDATA 元素。

这是正确的行为吗?如何将空格与 CDATA 分开?

我正在使用woodstox 实现。

4

3 回答 3

4

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

除此之外,Woodstox 确实将 CDATA 部分报告为不同的;但 Stax 规范对转换有一些“有趣”的要求——专家组的成员似乎不喜欢 CDATA 的处理方式与 CHARACTERS 有任何不同。

所以:如果您确实想单独报告它们,请确保禁用 IS_COALESCING:

inputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
于 2010-12-20T19:01:29.640 回答
3

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

于 2010-12-05T00:21:16.560 回答
0

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

(另请参阅有关类似问题的此消息。)

于 2010-12-05T02:14:51.520 回答