2011-12-19 176 views
10

我的XML看起來像這 -getChildNodes給人意想不到的結果

<collected_objects> 
     <object flag="complete" id="objId" version="1"> 
      <variable_value variable_id="varId">ValueGoesHere</variable_value> 
      <reference item_ref="2"/> 
     </object> 
     <object comment="objComment" flag="complete" id="objId" version="1"> 
      <reference item_ref="1"/> 
     </object> 
</collected_objects> 

我使用下面的代碼 -

Document dom = parser.getDocument(); 
    NodeList collected_objects = dom.getElementsByTagName("object"); 
    System.out.println("Number of collected objects are " + collected_objects.getLength()); 

     for (int i = 0; i < collected_objects.getLength(); i++) { 

      Node aNode = collected_objects.item(i); 
      //get children of "objects"   
      NodeList refNodes = aNode.getChildNodes(); 

      System.out.println("# of chidren are " + refNodes.getLength()); 

      //print attributes of "objects" 

      NamedNodeMap attributes = aNode.getAttributes(); 
      for (int a = 0; a < attributes.getLength(); a++) { 
      Node theAttribute = attributes.item(a); 
      System.out.println(theAttribute.getNodeName() + "=" + theAttribute.getNodeValue()); 

     } 

} 

它輸出原樣

Number of collected objects are 2 
# of chidren are 5 
flag=complete 
id=objId 
version=1 
# of chidren are 3 
comment=objComment 
flag=complete 
id=objId 
version=1 

我的問題是,爲什麼它的處理「小孩的#」分別是5和3?我不應該分別期待2和1嗎? 因爲第一個對象具有「variable_value」和「reference」和第二個對象只有「reference

從本質上講,我的意圖是要處理「對象」的孩子。

回答

8

那是因爲你有2 TEXT_NODE#text)。

以下內容包含文本節點及其相應的值。

<object flag="complete" id="objId" version="1"> 
    <TEXT_NODE /> 
    <variable_value variable_id="varId">ValueGoesHere</variable_value> 
    <reference item_ref="2"/> 
    <TEXT_NODE /> 
</object> 

這可以通過修改您的代碼進行驗證:

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document dom = dBuilder.parse(new ByteArrayInputStream(S.getBytes())); 
     NodeList collected_objects = dom.getElementsByTagName("object"); 
     System.out.println("Number of collected objects are " 
       + collected_objects.getLength()); 

     for (int i = 0; i < collected_objects.getLength(); i++) { 

      Node aNode = collected_objects.item(i); 
      // get children of "objects" 
      NodeList refNodes = aNode.getChildNodes(); 

      System.out.println("# of chidren are " + refNodes.getLength()); 

      // 
      for (int x = 0; x < refNodes.getLength(); x++) { 
       Node n = refNodes.item(x); 
       System.out.println(n.getNodeType() + " = " + n.getNodeName() + "/" + n.getNodeValue()); 
      } 

      // print attributes of "objects" 

      NamedNodeMap attributes = aNode.getAttributes(); 
      for (int a = 0; a < attributes.getLength(); a++) { 
       Node theAttribute = attributes.item(a); 
       System.out.println(theAttribute.getNodeName() + "=" 
         + theAttribute.getNodeValue()); 

      } 

     } 

輸出:

Number of collected objects are 2 
# of chidren are 5 
3 = #text/   
1 = variable_value/null 
3 = #text/   
1 = reference/null 
3 = #text/   
flag=complete 
id=objId 
version=1 
# of chidren are 3 
3 = #text/   
1 = reference/null 
3 = #text/   
comment=objComment 
flag=complete 
id=objId 
version=1 

其中,3 = TEXT_NODE和1 = ELEMENT_NODE

16

請確保您沒有<對象>節點子節點之間的空格。空白區被認爲是孩子節點,並返回。

測試,如果

childNode.getNodeType() == Node.ELEMENT_NODE 

應該夠了。

2

您只計算ELEMENT節點類型。你可以改變你的代碼,包括下面的檢查,如果你有興趣在每個子節點之間只有子元素

if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{ 
... 
} 
相關問題