2011-12-19 11 views
10

Moje XML wygląda this-getChildNodes dając nieoczekiwany rezultat

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

ja przetworzeniu go za pomocą poniższego Code

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

     } 

} 

wyprowadza as-

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 

Moje pytanie brzmi, dlaczego "# z chidren are" to odpowiednio 5 i 3? Czy nie powinienem oczekiwać odpowiednio 2 i 1? ponieważ pierwszy obiekt ma „variable_value” i „reference”, a drugi obiekt ma tylko „reference

Zasadniczo, moim zamiarem jest, aby przetwarzać dzieci „obiektów”.

Odpowiedz

8

To dlatego, że masz 2 TEXT_NODE (#text) między każdą węzłów potomnych.

Następujące zawierały węzły tekstowe i odpowiadające im wartości.

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

Można to sprawdzić poprzez modyfikację kodu:

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

      } 

     } 

Wyjście:

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 

Gdzie, 3 = TEXT_NODE i 1 = ELEMENT_NODE.

16

Upewnij się, że nie ma białych znaków między obiektami węzła <obiektu>. Białe spacje są uważane za potomne i zwracane jako takie.

Testowanie jeśli

childNode.getNodeType() == Node.ELEMENT_NODE 

powinno wystarczyć.

2

Liczysz tylko typy węzłów ELEMENT. Można zmienić swój kod to poniższy czek jeśli jesteś zainteresowany tylko elementów podrzędnych

if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{ 
... 
} 
Powiązane problemy