如何使用空字符串值创建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 规范 ,则在有效字符集中没有真正定义空字符串”。 因此文档构建器可能会忽略任何无效字符的出现。