2010-10-24 105 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();