2012-01-19 14 views
0

以下は私が使用しているXMLのサンプルです。フィールドの一部をストライプ化していますので、私のポイントを示す必要はありません。javaでDOMツリーをナビゲートする方法

私はこのXMLから注文を解析しようとしています。しかし、私は各注文の製品セットを解析しようとすると問題が発生します。最初の注文が処理されているとき、以下で説明する2つのセットを追加するのではなく、すべてを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

問題は、あなたがあなたのすべてのsets内のリストを与えるdoc.getElementsByTagName("set")を呼び出しているということです。以下は

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 ...私のjavaですドキュメント全体代わりに、あなたはこのように、各順序でそれを呼び出す必要があります:

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

は、あなたがXML文書から必要なコンテンツを取得するために「javax.xml.xpathの」APIを使用することができます。これらのAPIはJava SE 5で導入され、 'getElementsByTagName'よりもはるかに多くの制御を提供します。

関連する問題