【问题标题】:Is there any way to force JAVA to print empty CDATA within Elements?有什么方法可以强制 JAVA 在 Elements 中打印空 CDATA?
【发布时间】:2014-02-28 11:53:56
【问题描述】:

我知道这是不恰当的,但公司“在另一边”,出于某些原因,迫使我们更改此类代码:

<POZ />

进入

<POZ><!CDATA[[]]></POZ>

我找到了Forcing Empty CDATA Elements,但它需要附加一个额外的 XSL 文件,这是我想避免的。

我尝试了微不足道的

Element poz = new Element("POZ");
CDATA cdataContent = new CDATA("");
poz.addContent(cdataContent);

但它 - 当然 - 生成简单

<POZ />

不是我期望的扩展版本...

有没有办法强制 JAVA 在空元素中生成这些 CDATA 部分?

【问题讨论】:

  • 我看到了两种可能性:要么这是一个虚假的要求(即,编写它的人不理解 XML),要么您的客户/合作伙伴使用的是仅排序的本地解析器-of-but-not-really XML。

标签: java xml cdata


【解决方案1】:

理想情况下,任何 XML 应用程序都不应该关心 CDATA 转义和普通文本之间的区别,或者自终止的空元素与用单独的打开和关闭标记表示的元素之间的区别。我强烈建议殴打使用此文档的人,以使他们放弃此要求。

DOM 不认为空文本节点的概念有意义,无论它是否是 CDATA 节。我不确定是否有任何其他 XML API 会让您生成一个空的 CDATA,但如果答案是否定的,我不会感到惊讶。

如果您绝对需要,我建议您编写一个后处理阶段,对文件进行简单的字符串替换,以强制将其转换为您需要的形式。

【讨论】:

  • 让我重复一下你所说的强调:DOM 中没有 CDATA 这样的东西。
  • keshlam:这是我考虑的最后一次机会,但我讨厌这样的解决方案,只要我能做到,我就会反对它:-)
  • CDATA 作为 Text 节点的子类存在于 DOM 中。 EMPTY CDATA 节点通常不存在,就像通常存在空文本节点一样。您可以通过编辑 DOM 手动创建一个,但不要求在规范化或序列化 DOM 时保留它,或者它的存在被 XML 的任何下游处理保留/尊重 - 正如所述下游处理可能不(现在通常不)保留 CDATA 部分和任何其他类型的文本之间的区别。
  • 注意:当然,您可以重新实现序列化程序,或者刷一下它的开源版本并对其进行修改,以做你想做的事。因此,是的,可以“强制 Java”执行此操作,就像您可以说服它打印任何其他语法一样。但它并不容易/不标准这一事实强烈暗示维护工具的人认为它不受欢迎。
【解决方案2】:

如果你不能说服接收者正确使用 XML 是个好主意,那就发出

<POZ>[[[[[[CDATA]]]]]]</POZ>

来自 Java 应用,并使用 sed 或类似工具对其进行后处理。

【讨论】:

  • 是的。人们要求纯粹的句法细节;给他们一个纯语法的解决方案。如果他们抱怨,首先问问他们为什么认为他们需要它。
猜你喜欢
  • 2012-08-14
  • 2020-07-18
  • 2011-05-17
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2022-01-23
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多