2010-10-24 100 views
4

我有一个关于XML,Java使用DOM和空节点的问题。我目前正在研究一个项目,其中我抽取了一个抽象机器的XML描述符文件(用于文本解析)并解析一系列输入字符串。这些抽象机器的实际构建和解释都已经完成并且工作正常,但我遇到了一个相当有趣的XML需求。具体来说,我需要能够将一个空的InputString节点变成一个空字符串(“”),并仍然执行我的解析例程。但是,当我尝试从我的XML树中提取此空白节点时,会出现此问题。这会导致空指针异常,然后通常会发生不好的事情。这里是XML的违规片段(注意第一个元素为空):使用Java处理空节点DOM

//Get input strings to be validated 
xmlElement = (Element)xmlMachine.getElementsByTagName(XML_INPUT_STRING_LIST).item(0); 
xmlNodeList = xmlElement.getElementsByTagName(XML_INPUT_STRING); 
for (int j = 0; j < xmlNodeList.getLength(); j++) { 

    //Add input string to list 
    if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) { 
     arrInputStrings.add(xmlNodeList.item(j).getFirstChild().getNodeValue()); 

    } else { 
     arrInputStrings.add(""); 

    } 
} 

我应该如何处理这种情况下空:

<InputStringList> 
     <InputString></InputString> 
     <InputString>000</InputString> 
     <InputString>111</InputString> 
     <InputString>01001</InputString> 
     <InputString>1011011</InputString> 
     <InputString>1011000</InputString> 
     <InputString>01010</InputString> 
     <InputString>1010101110</InputString> 
    </InputStringList> 

我使用提取我的琴弦从列表中?我发现了很多删除空白文本节点的信息,但实际上我仍然必须将空白节点解析为空字符串。理想情况下,我想避免使用特殊字符来表示空白字符串。

预先感谢您的时间。

回答

7
if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) { 

nodeValue不应该为空;这将是firstChild本身可能为空,应检查:

Node firstChild= xmlNodeList.item(j).getFirstChild(); 
arrInputStrings.add(firstChild==null? "" : firstChild.getNodeValue()); 

但是注意,这仍然是内容是只有一个文本节点敏感。如果你有一个带有另一个元素的元素,或者一些文本和一个CDATA部分,只是获取第一个孩子的值不足以阅读整个文本。

你真正想要的是DOM Level 3 Core中的textContent property,它会给你所有的元素内的文本,但包含。

arrInputStrings.add(xmlNodeList.item(j).getTextContent()); 

这在Java 1.5之后可用。

+0

我明白了。所以,由于我的元素在技术上没有下面的文本节点,因此getFirstChild()会爆炸。说得通。而getTextContent()像魅力一样工作。感谢您及时的回复。 – phobos51594 2010-10-24 23:36:37

1

您可以使用类似jOOX的库来简化标准DOM操作。随着jOOX,你会得到这样的字符串列表:

List<String> strings = $(xmlMachine).find(XML_INPUT_STRING_LIST) 
            .find(XML_INPUT_STRING) 
            .texts();