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

时间:2010-10-07 18:53:00

标签: java xml

我正在使用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关于不间断空间的建议。

7 个答案:

答案 0 :(得分:16)

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

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

如果你真的想阻止元素被序列化为自动关闭,你可以变得可爱并添加零宽度空间作为文本节点值: <TYPE>&#x200B;</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>