2011-12-19 4 views
10

mio XML assomiglia a questo-getChildNodes dando risultato inaspettato

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

sto elaborando utilizzando sotto 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()); 

     } 

} 

emette 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 

mia domanda è perché "# of chidren are" sono 5 e 3 rispettivamente? Non dovrei aspettarmi 2 e 1 rispettivamente? perché primo oggetto ha "variable_value" e "reference" e secondo oggetto ha solo "reference"

In sostanza, il mio intento è quello di elaborare i bambini di "oggetti".

risposta

8

Ecco perché avete 2 TEXT_NODE (#text) tra ogni nodi figlio.

Di seguito sono inclusi i nodi di testo e i relativi valori corrispondenti.

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

Questo può essere verificata modificando il codice:

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

      } 

     } 

L'output:

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 

Dove, 3 = TEXT_NODE e 1 = ELEMENT_NODE.

16

Assicurarsi di non disporre di spazi bianchi tra < oggetto figlio >. Gli spazi bianchi sono considerati childnodes e restituiti come tali.

Testing se

childNode.getNodeType() == Node.ELEMENT_NODE 

dovrebbe essere sufficiente.

2

Si stanno solo contando i tipi di nodo ELEMENT. È possibile modificare il codice per includere il controllo qui sotto se siete interessati a elementi figlio solo

if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{ 
... 
}