2012-01-19 38 views
0

下面是我使用的xml示例,我已經列出了一些字段,因爲它們不需要證明我的觀點。如何在java中導航dom樹XML

我想解析這個XML的訂單。但是,當我嘗試解析每個訂單的產品組時,我遇到了問題。當第一個訂單正在處理時,而不是添加下面詳細介紹的2套,它將會把全部這個集合在xml中找到的第一個訂單。我不知道如何解決這個問題,因爲這對我來說都很新穎。下面是我的Java ...

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(xmlFile); 
doc.getDocumentElement().normalize(); 

// Create a list of orders and sub elements 
System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 
nList = doc.getElementsByTagName("order"); 
setList = doc.getElementsByTagName("set"); 
orders = new Order[nList.getLength()]; 
Node nNode = nList.item(i); 
if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

    Element eElement = (Element) nNode; 
    temp = new Order(); 
    // Populate order with details from XML 
    parseClientDetails(eElement); 

    // Add sets 
    parseSets(); 
    temp.setSets(setArray); 
    orders[i] = temp; 
} 

...

private void parseSets() { 
     Node nNode; 
     Element element; 
     for (int c = 0; c < setList.getLength(); c++) { 
      nNode = setList.item(c); 
      element = (Element) nNode; 

      tempSet = new Set(); 
      tempSet.setBandwidth(getValue("bandwidth", element)); 
      tempSet.setCategory(getValue("category", element)); 
      tempSet.setSet_package(getValue("package", element)); 
      setArray.add(tempSet); 
     } 
    } 

XML:

<orderSet> 
    <order> 
    <customer name="SelectCustomerDetails"> 
     <clientId>UK12345</clientId> 
     <etc>...</etc> 
    </customer> 
    <product> 
     <set> 
      <category>Silver</category> 
      <package>3000IP</package> 
      <bandwidth>160</bandwidth> 
     </set> 
     <set> 
      <category>Silver</category> 
      <package>3000IP</package> 
      <bandwidth>320</bandwidth> 
     </set> 
    </product> 
    </order> 
    <order> 
    ... 
    </order> 
</orderSet> 

回答

4

的問題是,你在呼喚doc.getElementsByTagName("set"),讓你所有sets的列表整個文件。相反,你需要調用它每個訂單上,像這樣:

nList = doc.getElementsByTagName("order"); 
orders = new Order[nList.getLength()]; 
Node nNode = nList.item(i); 
if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
    Element eElement = (Element) nNode; 

    //get the sets for the current order only 
    NodeList setList = eElement.getElementsByTagName("set"); 

    //now process the sets 
}