使用Java DOM处理空节点

时间:2010-10-24 22:08:40

标签: java xml parsing dom

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

    <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>

我使用以下方法从列表中提取字符串:

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

    }
}

我应该如何处理这个空案例?我发现了很多关于删除空白文本节点的信息,但实际上我仍然必须将空白节点解析为空字符串。理想情况下,我希望避免使用特殊字符来表示空白字符串。

提前感谢您的时间。

2 个答案:

答案 0 :(得分:7)

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

nodeValue不应为null; 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开始使用。

答案 1 :(得分:1)

您可以使用像jOOX这样的库来简化标准DOM操作。使用jOOX,您将获得字符串列表:

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