2011-12-19 13 views
10

मेरे एक्सएमएल इस-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> 

तरह लग रहा है मैं 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()); 

     } 

} 

यह जैसे-

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

आप केवल तत्व नोड प्रकारों की गणना कर रहे हैं। आप नीचे दिए गए जांच में शामिल करने के लिए यदि आप केवल बच्चे तत्वों

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