2011-12-19 20 views
10
Benim XML ben sorum neden yapıldığı haliyle

getChildNodes

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 

verir Kodunuzu

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

     } 

} 

altına kullanarak işliyorum bu-

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

benziyor

"hasıda içinde olan" 5 ve sırasıyla 3? Sırasıyla 2 ve 1 beklememeliyim? çünkü ilk obje "variable_value" vardır ve "reference" ve ikinci nesne yalnızca "reference"

Esasen, benim niyet "nesneler" çocukları işlenmesidir vardır.

cevap

8

ilgileniyorsanız aşağıdaki onay içerecek şekilde kodunu değiştirebilirsiniz.

aşağıdaki metin düğümleri ve karşılık gelen değerler dahil.

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

Bu

kodunuzu değiştirerek doğrulanabilir:

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

      } 

     } 

çıkışı:

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 

, = TEXT_NODE 3 ve = ELEMENT_NODE 1.

16

Eğer <nesne> düğüm çocuklar arasındaki boşlukları yok emin olun. Whitespaces, childnodes olarak kabul edilir ve bu şekilde döndürülür.

Test

childNode.getNodeType() == Node.ELEMENT_NODE 

yeterli olmalı eğer.

2

Yalnızca ELEMAN düğüm türlerini güveniyoruz. Eğer her çocuk düğümler arasındaki tek alt öğeleri

size 2 TEXT_NODE ( #text) var çünkü var
if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{ 
... 
}