2012-09-28 28 views
0

我想從xml(DOM)使用java讀取多層標記,示例xml是:如何使用java從多層標記XML(DOM)讀取特定元素

<root> 
    <subclass> 
     <subclass> 
      <subclass> 
       <name>test1</name> 
       <address>address1</address> 
       </subclass> 
       <name>test2</name> 
       <address>address2</address> 
     </subclass> 
     <name>test3</name> 
     <address>address3</address> 
    </subclass> 
</root>
如何閱讀<名稱> TEST2 < /名稱>和<地址> 地址2 < /地址>從上面的XML?

我給出了一個示例代碼..但我需要動態地查找這些值。 當我使用子類標記迭代bu時,它會提供所有數據。只是我想知道如何得到這樣<名> test2的 < /名稱>和<地址> 地址2 < /地址>具體數據。

下面是我的java代碼這是看完上面的xml:

NodeList fList = firstWordElement 
         .getElementsByTagName("root"); 
       for (int i = 0; i < fList.getLength(); i++) { 
        Node firstFLNode = fList.item(i); 
        if (firstFLNode.getNodeType() == Node.ELEMENT_NODE) { 
         Element firstWdElement = (Element) firstFLNode; 
         NodeList firstWdList = firstWdElement.getElementsByTagName("innerclass"); 

         for (int j = 0; j < firstWdList.getLength(); j++) { 

          Element firstWd1Element = (Element) firstWdList.item(j); 

          if (firstWd1Element.getNodeType() == Node.ELEMENT_NODE) { 
           String InnerName = ParseUtil.getTagValue("name", firstWd1Element); 
           String InnerFormat = ParseUtil.getTagValue("format", firstWd1Element); 
           String InnerDescription = ParseUtil.getTagValue("description", firstWd1Element); 

           NodeList innerClassList = firstWd1Element.getElementsByTagName("subclass"); 

           for (int k = 0; k < innerClassList.getLength(); k++) { 

            Element subClassElement = (Element) innerClassList 
              .item(k); 
            if (subClassElement.getNodeType() == Node.ELEMENT_NODE) { 
             String InnerSubName = ParseUtil.getTagValue("name", subClassElement); 
             System.out.println("Innername==="+ InnerSubName); 
             String InnerSubFormat = ParseUtil.getTagValue("format", subClassElement); 
             System.out.println("Innerformat==="+ InnerSubFormat); 
             String InnerSubDescription = ParseUtil.getTagValue("description", subClassElement); 
             System.out.println("Innerdescription==="+ InnerSubDescription); 

            } 
           } 

          } 



         } 
        } 
       } 

回答

0

傳統上,你必須遍歷低谷中的節點,通常通過創建的getChildren()從父節點的NodeList完成。如果你只想測試2節點,你必須進行某種比較 - 你不能直接跳到第二個節點。這就是說你可以,但是這不會做出一個非常強大或可擴展的解決方案。

1

使用XPath的API

您創建的XPathFactory:

XPathFactory factory = XPathFactory.newInstance(); 

然後,您可以使用此工廠創建XPath對象:

XPath xpath = factory.newXPath(); 

XPath對象編譯XPath表達式:

XPathExpression expr = xpath.compile("//book[author='Neal Stephenson']/title/text()"); 

Object result = expr.evaluate(doc, XPathConstants.NODESET); 

然後,您可以將結果投射到DOM節點列表並遍歷該查找以找到所有標題:

NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getNodeValue()); 
}