使用JavaDOM处理空节点

使用JavaDOM处理空节点,java,xml,parsing,dom,Java,Xml,Parsing,Dom,我有一个关于XML、Java对DOM的使用和空节点的问题。我目前正在从事一个项目,在这个项目中,我获取一个抽象机器的XML描述符文件(用于文本解析),并用它们解析一系列输入字符串。这些抽象机器的实际构建和解释都已经完成,并且运行良好,但我遇到了一个相当有趣的XML需求。具体来说,我需要能够将一个空的InputString节点转换为一个空字符串(“”),并且仍然执行我的解析例程。但是,当我试图从XML树中提取这个空白节点时,就会出现问题。这会导致空指针异常,然后通常会发生不好的事情。以下是令人不快

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


000
111
01001
1011011
1011000
01010
1010101110
我使用以下命令从列表中提取字符串:

//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("");

    }
}
//获取要验证的输入字符串
xmlement=(Element)xmlMachine.getElementsByTagName(XML\u输入\u字符串\u列表)。项(0);
xmlNodeList=xmlElement.getElementsByTagName(XML_输入_字符串);
对于(int j=0;j
我该如何处理这个空箱子?我已经发现了很多关于删除空白文本节点的信息,但是我仍然必须将空节点解析为空字符串。理想情况下,我希望避免使用特殊字符来表示空白字符串

提前感谢您抽出时间

if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) {
nodeValue
不应为空;可能是
firstChild
本身为空,应检查:

Node firstChild= xmlNodeList.item(j).getFirstChild();
arrInputStrings.add(firstChild==null? "" : firstChild.getNodeValue());
但是请注意,这仍然对只有一个文本节点的内容敏感。如果有一个元素中有另一个元素,或者有一些文本和CDATA节,那么仅获取第一个子元素的值不足以读取整个文本

您真正想要的是来自DOMLevel3core的文本,它将为您提供元素中的所有文本,不管这些文本是如何包含的

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

这在以后的版本中可用。

您可以使用类似的库来简化标准DOM操作。使用jOOX,您将得到字符串列表,例如:

List<String> strings = $(xmlMachine).find(XML_INPUT_STRING_LIST)
                                    .find(XML_INPUT_STRING)
                                    .texts();
List strings=$(xmlMachine).find(XML\u INPUT\u STRING\u List)
.find(XML\u输入\u字符串)
.text();

我明白了。因此,从技术上讲,我的元素下面没有文本节点,因此getFirstChild()正在爆炸。有道理。getTextContent()工作起来很有魅力。谢谢你的快速回复。
List<String> strings = $(xmlMachine).find(XML_INPUT_STRING_LIST)
                                    .find(XML_INPUT_STRING)
                                    .texts();