2011-12-19 44 views
10

XML của tôi trông giống như this-getChildNodes đưa ra kết quả bất ngờ

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

Tôi đang xử lý nó sử dụng dưới đây số-

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

     } 

} 

nó ra như-

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 

Câu hỏi của tôi là lý do tại sao "# của trẻ em thất bại" là 5 và 3 tương ứng? Tôi không nên mong đợi 2 và 1 tương ứng? đối tượng vì lần đầu tiên có "variable_value" và "reference" và đối tượng thứ hai chỉ có "reference"

Về cơ bản, mục đích của tôi là để xử lý trẻ em của "đối tượng".

Trả lời

8

Đó là bởi vì bạn có 2 TEXT_NODE (#text) giữa mỗi đứa trẻ nút.

Sau đây bao gồm các nút văn bản và giá trị tương ứng của chúng.

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

Điều này có thể được xác nhận bằng cách sửa đổi mã của bạn:

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

      } 

     } 

Sản lượng:

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 

đâu, 3 = TEXT_NODE và 1 = ELEMENT_NODE.

16

Đảm bảo bạn không có khoảng trắng giữa < đối tượng > nút con. Khoảng trắng được coi là mã con và được trả lại như vậy.

Kiểm tra nếu

childNode.getNodeType() == Node.ELEMENT_NODE 

nên là đủ.

2

Bạn chỉ đang đếm các loại nút ELEMENT. Bạn có thể thay đổi mã của bạn để bao gồm việc kiểm tra dưới đây nếu bạn quan tâm đến yếu tố con chỉ

if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{ 
... 
} 
Các vấn đề liên quan