2010-10-07 25 views
9

我正在使用Transform对象来保存我的XML文件,但似乎删除了空的文本节点。有什么方法可以创建(并保留)带有空字符串的文本节点,即“”。如何使用空字符串值创建XML文本节点(以Java编程)

这里是我创建节点:

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

type.appendChild(doc.createTextNode(value)); 

它只是有时value为空字符串“”。当我看XML使用文本编辑器我看到

<TYPE /> 

,而不是

<TYPE></TYPE> 

我看了这个XML文件后回来,并遍历节点<TYPE>元素根本不具备任何孩子,即使我明确地为它创建了一个#text节点!

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

重要说明,我不是从一组已知的标记工作,而我的工作程序采用文本节点的存在来分配JTextField到GUI。只是有时候该字段留空(不为空,但是“”)。当我存储该字段,然后将其读回时,由于没有文本节点,因此GUI不再显示JTextField。所以我正在研究如何创建一个XML文档,该文档创建一个文本节点,即使它没有任何内容。如果这不能用XML完成,那么我将不得不使用一个属性来标记可编辑的标签(有点像Andrey Breslav建议的),因此应该分配一个JTextField

我会尝试Mads Hansen提出的一个不会破坏的空间。

+1

相当于 2010-10-07 20:19:14

回答

14

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

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

如果你真的想避免的元件将被序列化为自闭,你可以得到可爱,并添加零宽度空格作为文本节点值:<TYPE>&#x200B;</TYPE>这将是这样的:<TYPE></TYPE>

它在技术上并不是一个“空”字符串,但可能实现你想要的,并且如果选择和使用文本节点,将不会填充空格。

+0

这正是我想要的。我不得不改变我的焦点侦听器,用&#x200B;替换空字符串。但那是微不足道的。唯一的一个主要缺点是,如果有人手动编辑XML文件并忘记在空字段中放置一个不间断的空间,它会弄乱我的GUI - 但我可以忍受那:) – BigMac66 2010-10-12 12:16:38

1

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

+0

我试过这个,它确实有效,但是使XML文件大约大20%,并且看上去不正确的IMO。 – BigMac66 2010-10-12 12:20:00

0

如果您考虑XML specs,则在一组有效的字符中没有真正定义空字符串“'。所以文档生成器可能会忽略任何无效的字符。

4

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

相反,Java的null""是完全不同的概念。

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

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/>或同意关于XML Parser,<Type></Type>没有区别。

相关问题