2013-08-27 93 views
2

我有下面的XML:計算XML文檔的XPath

<?xml version="1.0" encoding="UTF-8" ?> 
<bookstore> 
    <book> 
     <title lang="en">Everyday Italian</title> 
     <author>Giada De Laurentiis</author> 
     <account_number>1111 1111 1111 1111</account_number> 
     <year>2005</year> 
     <price>30.00</price> 
    </book> 
    <book> 
     <title lang="en">Harry Potter</title> 
     <author>J K. Rowling</author> 
     <account_number>2222 2222 2222 2222</account_number> 
     <year>2005</year> 
     <price>29.99</price> 
    </book> 
    <book> 
     <title lang="en">Learning XML</title> 
     <author>Erik T. Ray</author> 
     <account_number>3333 3333 3333 3333</account_number> 
     <year>2003</year> 
     <price>39.95</price> 
    </book> 
</bookstore> 

我感興趣的是找到的中的XPath ACCOUNT_NUMBER具有價值 。 請指導我如何讓XPath知道標籤及其價值。

回答

3
//account_number[text()='neededValue'] 

這意味着所有account_number元素與[neededValue]

如果你想爲這本書父元素:

//account_number[text()='neededValue']/ancestor::book/ 

然後:

//account_number[text()='neededValue']/ancestor::book/OPTION 

哪裏OPTION可以titleauthoryearprice等爲了得到其他的具有特定帳號的該書中的元素。

+1

* + 1 *進行比較之前轉換爲其字符串內容以獲得良好的解釋。 –

+1

非常感謝您的回覆。這裏面的另一個挑戰是如果我沒有使用XML文件,只知道一些標籤及其值,那麼如何找到該標籤的XPath?從標籤到其根目錄需要一些逆向工程。 – NewUser3542

2

您可以使用上下文節點.[a=b]斷言,它將如果你想有一個父節點基於被轉換爲字符串比較正確的部分「2222 2222 2222 2222」

//account_number[.="2222 2222 2222 2222"] 

前它的孩子的價值,你可以將你的XPath嵌套在另一個謂詞中。例如,如果你想與特定帳號的所有的書,你可以使用:

//book[account_number[.="2222 2222 2222 2222"]] 

------    |-- child value test--| 
^
    | |---- matching child condition -----| 
    | 
    +--- all book descendants from the root node 

要獲得這些書的標題,你繼續前面的XPath與title

//book[account_number[.="2222 2222 2222 2222"]]/title 

編輯:回到這個答案,有一個更簡單的版本

//book[account_number="2222 2222 2222 2222"]/title 

account_number節點在與"2222 2222 2222 2222"

+0

* + 1 *表示不同的技術。 –

+0

非常感謝您的回覆。這裏面的另一個挑戰是如果我沒有使用XML文件,只知道一些標籤及其值,那麼如何找到該標籤的XPath?從標籤到其根目錄需要一些逆向工程。 – NewUser3542