2012-09-13 70 views
0

我正在嘗試爲我的xml使用DOM解析器。代碼如下。它按標籤類型及其屬性(如價格和顏色)列出所有元素。然而,我很難找到如何給代碼添加限制,比如「給我所有10美元以上的筆」或「筆的顏色是黑色的名字」。有人可以幫我嗎。使用DOM解析器解析xml並添加限制

感謝
我.xml文件看起來是這樣的:

<equipment> 
    <type> 
    <description>pen</description> 
    <name>parker</name> 
    <price value="USD">8.00</price> 
    <color>black</color> 
</type> 
    <type> 
    <description>pen</description> 
    <name>ball point</name> 
    <price value="USD">20.00</price> 
    <color>purple</color> 
</type> 
<type> 
    <description>pen</description> 
    <name>sharpie</name> 
    <price value="USD">15.00</price> 
    <color>blue</color> 
</type> 
<type> 
    <description>pen</description> 
    <name>staples</name> 
    <price value="USD">6.00</price> 
    <color>red</color> 
</type> 
<type> 
    <description>pen</description> 
    <name>integra</name> 
    <price value="USD">12.00</price> 
    <color>white</color> 
</type> 

這裏是代碼爲我的解析器

public static void main(String[] args)throws SAXException, IOException, ParserConfigurationException { 

      File fXmlFile = new File("docs\\abc.xml"); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc = dBuilder.parse(fXmlFile); 
      doc.getDocumentElement().normalize(); 

      NodeList nList = doc.getElementsByTagName("type"); 
      for(int i=0;i<nList.getLength();i++){ 
       Node nNode = nList.item(i); 

        if(nNode.getNodeType() == Node.ELEMENT_NODE){ 

         Element eElement = (Element) nNode; 
         System.out.println("Name:" + getTagValue("name", eElement)); 
         System.out.println("Price: "+ getTagValue("price", eElement)); 
         System.out.println(getAttributeValue("price", "value", eElement)); 
         System.out.println("Description: "+getTagValue("description", eElement)); 
         System.out.println("color:"+ getTagValue("color", eElement)); 
        } 
      } 

     } 

     private static String getTagValue(String sTag, Element eElement) { 
      NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 
      Node nValue = (Node) nlList.item(0); 

      return nValue.getNodeValue(); 
     } 

     private static String getAttributeValue(String sTag, String attributeName, Element eElement){ 
      NamedNodeMap nodeMap = eElement.getElementsByTagName(sTag).item(0).getAttributes(); 

      return nodeMap.getNamedItem(attributeName).getNodeValue(); 
     } 
    } 
+0

添加XML文件在這裏爲您解決問題,這將有助於我們, – gks

+0

你好,請找到上面更新的 – rob

回答

0

如果你想parse XML based on some criteria,您可以使用Java XPath API代替基於DOM的解析器。

+0

yupp試過xpath,它工作的很棒!!!!!但是想嘗試編程。 – rob

+0

當你說「編程」時,你的意思是檢索匹配的節點並遍歷你的代碼?如果是這樣,你有機會檢查我的回覆中的第一個超鏈接嗎?它指出了一個來自developer.ibm.com的比較好的教程,它比較了DOM和XPath的實現方式。 – Vikdor

0

如果你想添加過濾器你最好做手工,並採用XMLStreamReader的可能help.follow步驟:

  1. 將您的XML文件導入使用Transformer
  2. 字符串中的字符串轉換爲字節數組並將其傳遞給XMLStreamReader。
  3. 迭代從一個元素到另一個

Transformer t=TransformerFactory.newInstance().newTransformer(); 
StringWriter sw=new StringWriter();   
StreamResult result=new StreamResult(sw); 
DOMSource d=new DOMSource(XMLdoc); 
t.transform(d, result); 
tring xmlstring=sw.toString(); 

ByteArrayInputStream bain = new yteArrayInputStream(xmlstring.getBytes()); 
XMLInputFactory factory1 = XMLInputFactory.newInstance(); 
XMLStreamReader reader = factory1.createXMLStreamReader(bain); 

while(reader.hasNext()) 
{ 
    reader.next(); 
    if(reader.getEventType==XMLStreamReader.START_ELEMENT) 
    { 
     if(reader.getLocalName().equals("price")) 
     { 
      //your logic 
     } 
    } 
} 

希望它有助於..