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

我使用Transform对象来保存我的XML文件,但似乎删除了空文本节点。 有没有办法创建(并保持)带有空字符串即“”的文本节点。

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

 Element type = doc.createElement("TYPE"); type.appendChild(doc.createTextNode(value)); 

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

  

代替

  

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

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

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

我将尝试Mads Hansen提出的不间断空间。

没有文本 的文本节点不是文本节点

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

如果你真的想要阻止元素序列化为自动关闭,你可以变得可爱并添加零宽度空间作为文本节点值: ,它们看起来像:

它在技术上不是一个“空”字符串,但可能达到你想要的效果,如果选择并使用了文本节点,则不会填充空格。

从XML的角度来看, 之间没有区别。 有两种等价物,可以互换使用。 对于XML解析器,它意味着没有文本。 解析器不区分“无文本”和“零长度文本”。

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

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

以下是您要查找的代码:

 try{ DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder=docFactory.newDocumentBuilder(); //root Elements -- Response Document doc=docBuilder.newDocument(); doc.setXmlStandalone(true); Element response=doc.createElement("Data"); doc.appendChild(response); // Child Element -- Play Element hangup=doc.createElement("Type"); response.appendChild(hangup); //Writer the content into xml file TransformerFactory transformerFactory=TransformerFactory.newInstance(); Transformer transformer=transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT,"yes"); DOMSource source=new DOMSource(doc); StreamResult result=new StreamResult(sayOut); //StreamResult result=new StreamResult(System.out); transformer.transform(source,result); logger.info("===========XML GENERATION DON FOR HANGUP============"); }catch(ParserConfigurationException pce){ logger.error(" ==============2======== ERROR IN PRASERCONFIGURATION ==================================="); pce.printStackTrace(); } 

由它生成的输出:

     

希望我已经给出了正确的东西……虽然我同意与XML Parser没有区别。

我会去一个字符串属性而不是标签内容。 另一种选择是使用内容但是在内容为空字符串的情况下放置属性。

如果考虑XML 规范 ,则在有效字符集中没有真正定义空字符串”。 因此文档构建器可能会忽略任何无效字符的出现。