如何使用空字符串值创建XML文本节点(在Java中)

Big*_*c66 11 java xml

我正在使用一个Transform对象来保存我的XML文件,但它似乎删除了空文本节点.有没有办法创建(并保持)带有空字符串即""的文本节点.

以下是我创建节点的方法:

Element type = doc.createElement("TYPE");

type.appendChild(doc.createTextNode(value));
Run Code Online (Sandbox Code Playgroud)

只是有时候value是一个空字符串"".当我用文本编辑器查看XML时,我看到了

<TYPE />
Run Code Online (Sandbox Code Playgroud)

代替

<TYPE></TYPE>
Run Code Online (Sandbox Code Playgroud)

在我读回这个XML文件并遍历节点后,<TYPE>元素根本没有任何子节点,即使我为它明确创建了一个#text节点!

编辑 - 感恩节快乐(我的加拿大同胞)

重要提示,我不是从一组已知的标签开始工作,而是我正在处理的程序使用文本节点的存在JTextField来为GUI 分配.只是有时候该字段是空的(不是空而是"").当我存储该字段然后将其读回时,GUI不再渲染JTextField,因为没有文本节点.所以我正在研究创建XML文档的方法,即使文档节点中没有任何内容,也可以创建文本节点.如果简单地无法用XML完成,那么我将不得不使用一个属性来标记可编辑的标签(有点像Andrey Breslav建议的那样),因此应该有一个JTextField分配.

我将尝试Mads Hansen关于不间断空间的建议.

Mad*_*sen 18

文本节点没有文字 不是一个文本节点.

如果您正在尝试控制XML元素的序列化方式,<TYPE/>并且<TYPE></TYPE>是等效的,那么如果使用任何一个XML处理器,则无关紧要.两者都声明没有任何TYPE元素text().大多数处理器将空元素序列化为自闭元素.

如果你真的想阻止元素被序列化为自闭,你可以得到可爱,并添加零宽度空格作为文本节点值: <TYPE>&#x200B;</TYPE>它看起来像:<TYPE></TYPE>.

这不是技术上的"空"的字符串,但可能会达到你想要什么,而不会与空间垫如果文本节点被选择和使用.


van*_*nje 5

<TYPE/>从 XML 的角度来看,和之间没有区别<TYPE></TYPE>。两者是等效的并且可以互换使用。对于 XML 解析器来说,这意味着没有文本。解析器不区分“无文本”和“零长度文本”。

相比之下Java的null和""是完全不同的概念。

因此,如果您想从 Java 值映射到 XML,反之亦然,您必须处理这种不匹配的情况。并且有几种可能的替代方案。例如,您可以放弃null字符串变量的值。然后您必须确保所有字符串变量都用空字符串初始化。或者您可以说没有文本子元素的 TYPE 元素(序列化为<TYPE/>或<TYPE></TYPE>)意味着 Java 中的空字符串,而缺少 TYPE 元素则代表null。这是你的选择。