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

如何使用空字符串值创建XML文本节点(在Java中),java,xml,Java,Xml,我正在使用Transform对象保存XML文件,但它似乎删除了空文本节点。有没有办法创建(并保留)一个带有空字符串的文本节点,即“” 以下是创建节点的方式: Element type = doc.createElement("TYPE"); type.appendChild(doc.createTextNode(value)); 只是有时候value是一个空字符串“”。当我使用文本编辑器查看XML时,我看到 <TYPE /> 而不是 <TYPE></TYP

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

以下是创建节点的方式:

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

type.appendChild(doc.createTextNode(value));
只是有时候
value
是一个空字符串“”。当我使用文本编辑器查看XML时,我看到

<TYPE />

而不是

<TYPE></TYPE>

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

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

重要注意事项,我不是使用一组已知的标记,而是使用一个文本节点将
JTextField
分配给GUI。只是有时候字段是空的(不是null而是“”)。当我存储该字段并将其读回时,GUI不再呈现
JTextField
,因为没有文本节点。因此,我正在研究创建XML文档的方法,该文档创建文本节点,即使其中没有任何内容。如果XML不能做到这一点,那么我必须使用一个属性来标记可编辑的标记(有点像Andrey Breslav建议的),因此应该分配一个
JTextField


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

我选择字符串属性而不是标记内容。另一种选择是使用内容,但如果内容是空字符串,则放置一个属性。

如果考虑XML,空字符串“”实际上不在“强>有效< /强>字符集中定义。因此,文档生成器可能只是忽略任何无效字符的出现。

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

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

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

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

如果您试图控制XML元素的序列化方式,
是等效的,如果使用了这两种元素,对XML处理器来说都无关紧要。两者都在声明一个类型元素,但没有任何
text()
。大多数处理器将空元素序列化为自动关闭元素

如果您真的想防止元素被序列化为自动关闭,您可以添加一个零宽度的空格作为文本节点值:
看起来像:


从技术上讲,它不是一个“空”字符串,但可能达到您想要的效果,并且如果选择并使用文本节点,它将不会填充空格

以下是您要查找的代码:

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>


希望我给了正确的东西。。。尽管我同意
与XML解析器没有区别。

我遇到过类似的问题,当XML被解析回时,
被视为空,而我需要的是
,因此它将被解析为空字符串。我最终解决了这个问题,向它添加了一个空的注释节点,使它看起来像这样


很抱歉,如果这不能直接回答这个问题,但这是谷歌的最佳答案,所以我想有人可能会觉得这很有用。

你应该用

@XmlElement(nillable=true)
只需将其设置为null,您将获得:

<TYPE xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<TYPE></TYPE>

它表示元素为空

否则,如果只需要打开和关闭标记,只需将其值设置为“”(空字符串)。您将获得:

<TYPE xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<TYPE></TYPE>


相当于我想做的事情。我不得不改变我的焦点侦听器,用​;但这有点微不足道。唯一的主要缺点是,如果有人在手动编辑XML文件时忘记在空字段中添加不间断的空格,这会弄乱我的GUI-但我可以接受:)我尝试了这个方法,但它确实有效,但使XML文件大了约20%,在我看来并不正确。不,这不起作用,OP在问题中明确地说,有时值是空字符串“”。当我用文本编辑器查看XML时,我看到的是
,而不是