2015-11-29 20 views
0

我有一個在java中迭代xml的問題。我有一個根節點作爲元素,裏面的元素標籤有兩個子節點,但我得到的節點長度爲1.可以任何一個指南我如何糾正它。我在下面提到了我的代碼。在遍歷Java中的XML節點的問題

import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.CharacterData; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 


public class Test { 




     public static void main(String arg[]) throws Exception{ 


      String xmlRecords = "<data><employee><name>A</name><title>Manager</title><name>B</name><title>Manager</title></employee></data>"; 

      DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(xmlRecords)); 

      Document doc = db.parse(is); 

      NodeList nodes = doc.getElementsByTagName("employee"); 

      for (int i = 0; i < nodes.getLength(); i++) { 
       Element element = (Element) nodes.item(i); 

       NodeList name = element.getElementsByTagName("name"); 
       Element line = (Element) name.item(i); 
       System.out.println("Name: " + getCharacterDataFromElement(line)); 

       NodeList title = element.getElementsByTagName("title"); 
       line = (Element) title.item(i); 
       System.out.println("Title: " + getCharacterDataFromElement(line)); 
      } 

      } 

      public static String getCharacterDataFromElement(Element e) { 
      Node child = e.getFirstChild(); 
      if (child instanceof CharacterData) { 
       CharacterData cd = (CharacterData) child; 
       return cd.getData(); 
      } 
      return ""; 
      } 

} 

結果:

Name: A 
Title: Manager 

預期輸出:

Name: A 
    Title: Manager 
    Name: B 
    Title: Manager 

回答

2

你的XML是

<data> 
    <employee> 
     <name>A</name> 
     <title>Manager</title> 
     <name>B</name> 
     <title>Manager</title> 
    </employee> 
</data> 

我會建議你

<data> 
    <employee> 
     <name>A</name> 
     <title>Manager</title> 
    </employee> 
    <employee> 
     <name>B</name> 
     <title>Manager</title> 
    </employee> 
</data> 

嘗試有其他方式(正確),它的打印名稱和標題

0

幾件事情只有1名員工節點:只有一個<employee>節點,所以你循環迭代一次。考慮增加一個第二節點到字符串:

String xmlRecords = "<data><employee><name>A</name><title>Manager</title></employee>" + 
        "<employee><name>B</name><title>Manager</title></employee></data>"; 

其次,對於<name><title>不這些內部節點上迭代,因爲這裏僅有一個每個員工內。所以使用零而不是i。這當然取決於上面的父節點變化。

NodeList name = element.getElementsByTagName("name"); 
Element line = (Element) name.item(0); 

NodeList title = element.getElementsByTagName("title"); 
line = (Element) title.item(0); 

上面做得出你想要的結果:

Name: A 
Title: Manager 
Name: B 
Title: Manager