2015-07-21 100 views
1

我試圖從我的XML數據文件(例如Pantone 100)打印特定節點。我希望它能夠打印出pantone 100的所有屬性,例如所有的顏色和數據,但我不確定如何正確地格式化XPath編譯的方式,以便只取得特定的pantone編號。我是尋找。Java XPath表達式錯誤

編輯:下面輸出的代碼空

XML數據

<inventory> 
    <Product pantone="100" blue="7.4" red="35" green="24"> </Product> 
    <Product pantone="101" blue="5.4" red="3" rubine="35" purple="24"> </Product> 
    <Product pantone="102" orange="5.4" purple="35" white="24"> </Product> 
    <Product pantone="103" orange="5.4" purple="35" white="24"> </Product> 
    <Product pantone="104" orange="5.4" purple="35" white="24"> </Product> 
    <Product pantone="105" orange="5.4" purple="35" white="24"> </Product> 
    <Product pantone="106" black="5.4" rubine="35" white="24" purple="35" orange="5.4"> </Product> 
</inventory> 

代碼

import org.w3c.dom.*; 
import javax.xml.xpath.*; 
import javax.xml.parsers.*; 
import java.io.IOException; 
import org.xml.sax.SAXException; 

public class XPathDemo { 

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

     DocumentBuilderFactory domFactory 
       = DocumentBuilderFactory.newInstance(); 
     domFactory.setNamespaceAware(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder(); 
     Document doc = builder.parse("data.xml"); 
     XPath xpath = XPathFactory.newInstance().newXPath(); 
     // XPath Query for showing all nodes value 
     XPathExpression expr = xpath.compile("/inventory/Product[@pantone='100']"); 

     Object result = expr.evaluate(doc, XPathConstants.NODESET); 
     NodeList nodes = (NodeList) result; 
     for (int i = 0; i < nodes.getLength(); i++) { 
      System.out.println(nodes.item(i).getNodeValue()); 
     } 
    } 
} 

輸出 空

回答

2

輸出爲空,因爲getNodeValue在這裏不適用。 getTextContent會爲您提供開始和結束標記之間的文本,例如FOOBAR在這個例子:

<Product pantone="100" blue="7.4" red="35" green="24">FOOBAR</Product>`. 

但是,如果你想打印的所有屬性值的結果集:

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

或使用a.item(j).getNodeName()a.item(j).getNodeValue()分別檢索屬性名稱或值。

3

我使用XPath(字面上今天學到它)沒有專家,所以我不是100%肯定這一點,但你必須/inventory/product/pantone/text(@=100),而是試試這個:

/inventory/Product[@pantone='100'] 

據我瞭解,這將匹配Product,屬性爲pantone,等於"100"

至於打印數據,我不確定,但希望這會讓你走上正軌。

編輯:查看此頁面:Node。它是Node類型的javadoc。由於geert3在他/她的回答中說getNodeValue()返回節點的值,在這種情況下該值是元素的值,而不是屬性(例如:在<element>value</element>中元素元素的值是值),在您的情況下null因爲它是空的(如果它認爲類型是字符串,也許它會是""而不是null?)。

嘗試呼叫Node#getAttributes(),然後在NamedNodeMapNamedNodeMap#item(int)之間迭代以獲得Node這些應該是屬性(我認爲,如果我正確理解API)。 getNodeName()應該是屬性的名稱(例如,pantone)並且getNodeValue()應該是該屬性的值(例如,100)。

+0

這似乎工作,但我得到「空」作爲輸出。不知道什麼是錯的 – ssj3goku878

+1

@ ssj3goku878我已經在Google上搜索了'Node' javadoc,並盡了我最大的努力來更新答案,成爲您正在尋找的東西。嘗試一下並回報。 –