我正在使用Transform
对象来保存我的XML文件,但它似乎删除了空文本节点。有没有办法创建(并保留)带有空字符串的文本节点,即“”。
以下是我创建节点的方法:
Element type = doc.createElement("TYPE");
type.appendChild(doc.createTextNode(value));
有时候value
是一个空字符串“”。当我用文本编辑器查看XML时,我看到了
<TYPE />
而不是
<TYPE></TYPE>
在我读回这个XML文件并遍历节点后,&lt; TYPE&gt;即使我明确地为它创建了一个#text节点,元素也没有任何子节点!
编辑 - 感恩节快乐(对我的加拿大同胞们而言)
重要提示,我不使用已知的一组标记,而是我正在处理的程序使用文本节点的存在来为GUI分配JTextField
。只是有时候该字段是空的(不是空而是“”)。当我存储该字段然后将其读回时,GUI不再呈现JTextField
,因为没有文本节点。所以我正在寻找创建XML文档的方法,即使文档节点中没有任何内容,也可以创建文本节点。如果简单地无法用XML完成,那么我将不得不使用一个属性来标记可编辑的标签(有点像Andrey Breslav建议的那样),因此应该分配JTextField
。
我会尝试Mads Hansen关于不间断空间的建议。
答案 0 :(得分:16)
没有文字的文字节点 不是文字节点 。
如果您尝试控制XML元素的序列化方式,<TYPE/>
和<TYPE></TYPE>
是等效的,如果使用了XML处理器,则无关紧要。两者都声明了一个没有任何text()
的TYPE元素。大多数处理器会将空元素序列化为自闭元素。
如果你真的想阻止元素被序列化为自动关闭,你可以变得可爱并添加零宽度空间作为文本节点值: <TYPE>​</TYPE>
这将是看起来像是:<TYPE></TYPE>
。
从技术上讲,它不是一个“空”字符串,但可能达到你想要的效果,如果选择并使用了文本节点,则不会填充空格。
答案 1 :(得分:4)
从XML的角度来看,<TYPE/>
和<TYPE></TYPE>
之间没有区别。有两种等价物,可以互换使用。对于XML解析器,它意味着没有文本。解析器不区分“无文本”和“零长度文本”。
相比之下,Java的null
和""
是完全不同的概念。
因此,如果您想要从Java值映射到XML,反之亦然,那么您必须处理这种不匹配。并且有几种可能的替代方案。例如,您可以放弃String变量的null
值。然后你必须确保所有的String变量都用空字符串初始化。或者你可以说没有文本子元素的TYPE元素(序列化为<TYPE/>
或<TYPE></TYPE>
)表示Java中的空字符串,缺少的TYPE元素代表null
。这是你的选择。
答案 2 :(得分:2)
以下是您要寻找的代码:
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 version="1.0" encoding="UTF-8"?>
<Data>
<Type/>
</Data>
希望我已经给出了正确的答案......虽然我同意<Type/>
或<Type></Type>
与XML Parser没有区别。
答案 3 :(得分:1)
我会选择字符串属性而不是标记内容。另一种选择是使用内容但是在内容为空字符串的情况下放置属性。
答案 4 :(得分:0)
如果您考虑XML specs,则在有效字符集中未真正定义空字符串''。因此,文档构建器可能会忽略任何无效字符的出现。
答案 5 :(得分:0)
我遇到过类似的问题,当解析XML时,当我需要的<Element />
时,<Element></Element>
被视为null,因此它将被解析为空字符串。最后,我通过向其添加一个空注释节点来解决此问题,使其最终看起来像<Element><!----></Element>
。
对不起,如果这不能直接回答问题,但这是google上的最佳答案,以为有人可能会觉得有用。
答案 6 :(得分:0)
您应该使用
注释您的字段@XmlElement(nillable=true)
只需将其设置为null,您将得到:
<TYPE xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
它表示一个元素为空。
否则,如果只想打开和关闭标签,则将其值设置为“”(空字符串)。您会得到:
<TYPE></TYPE>