2016-03-07 35 views
0

的XML文件的節點列表,我有一個XML文件,如下檢索的Java

<?xml version="1.0"?> 
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?> 
<!DOCTYPE catalog SYSTEM "catalog.dtd"> 
<catalog> 
    <product description="Cardigan Sweater" product_image="cardigan.jpg"> 
     <catalog_item gender="Men's"> 
     <item_number>QWZ5671</item_number> 
     <price>39.95</price> 
     <size description="Medium"> 
      <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
      <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
     </size> 
     <size description="Large"> 
      <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
      <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
     </size> 
     </catalog_item> 
     <catalog_item gender="Women's"> 
     <item_number>RRX9856</item_number> 
     <price>42.50</price> 
     <size description="Small"> 
      <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
      <color_swatch image="navy_cardigan.jpg">Navy</color_swatch> 
      <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
     </size> 
     <size description="Medium"> 
      <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
      <color_swatch image="navy_cardigan.jpg">Navy</color_swatch> 
      <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
      <color_swatch image="black_cardigan.jpg">Black</color_swatch> 
     </size> 
     </catalog_item> 
    </product> 
</catalog> 

什麼是提取特定名稱(catalog_item)所有節點的最佳方式,並創建一個列表(目錄項目列表)在java中。 請注意,XML將包含任何節點列表,我應該能夠指定節點的名稱並提取該名稱的所有節點以創建列表。

+0

[XPath的?](https://docs.oracle.com/javase/tutorial/jaxp/xslt/xpath.html) – Neijwiert

+1

我想你可以使用['Document.getElementsByTagName()'](http://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Document.html#getElementsByTagName-java.lang.String-) – potame

+0

Document.getElementsByTagName( 「catalog_item」);給出了一個容易迭代和提取數據的所需節點的列表。謝謝 – sher17

回答

2

您可以使用HTML分析器,如Jsoup下載並將jar文件添加到您的項目中。然後做這個。

Document document = Jsoup.parse(html); 
Elements elements = document.select("catalog_item"); //get everything under catalog_item 

for (Element element : elements) { 
    String number = element.getElementsByTag("price").text(); // select specific tag 
    // select rest of info from tags you need 
} 
+1

然後它不是保證它會正確地做出選擇。另外,你爲什麼要爲OP在其中付出的努力做這麼多的努力。 – Neijwiert

+1

我對XPath不熟悉,但是使用Jsoup時應該可以正常工作。不過,我會承認你的第二點。 – anaxin

0

我想詳細發佈我的方法以幫助需要相同場景幫助的人。

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(new File("C:/ProductItems.xml")); 
doc.getDocumentElement().normalize(); 

//Reading all the catelog items and store in a NodeList 
NodeList catItemList=doc.getElementsByTagName("catalog_item"); 

if(catItemList.getLength()>0){  //if there are catelog items 
    for(int itemIndex=0 ; itemIndex < catItemList.getLength() ; itemIndex++){ 
      Node catalogItem=catItemList.item(itemIndex); 

      if (catalogItem.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) catalogItem; 
       String gender = eElement.getAttribute("gender"); 
      } 
    } 
} 
1

下面是在vtd-xml中進行節點提取的代碼。提取邏輯是,你需要填寫什麼...

import com.ximpleware.*; 

public class retrieveNodes{ 
    public static void main(String s[]) throws VTDException,java.io.UnsupportedEncodingException,java.io.IOException{ 
     VTDGen vg = new VTDGen(); 
     vg.setLCDepth(5); 
     if (!vg.parseFile("input.xml", false)) 
      return; 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("/catalog/product/catalog_item"); 
     int i=0; 
     while((i=ap.evalXPath())!=-1){ 
      if (vn.toElement(VTDNav.FIRST_CHILD,"itemNumber")){ 
       int j=vn.getText(); 
       if (j!=-1) 
        System.out.println("text node ==>"+vn.toString(j); 
       vn.toElement(VTDNav.PARENT); 
      } 
     } 

    } 

}