2011-12-15 59 views
1

我有這樣的XML:需要與xmlpath中提取數據/ xmlsearch

<?xml version="1.0" encoding="utf-8"?> 
<xml> 
    <site> 
    <id>123</id> 
    <po>BT123</po> 
    </site> 
    <order> 
    <shipping> 
     <shippingmethod>1</shippingmethod> 
     <firstname>Test</firstname> 
     <lastname>User</lastname> 
     <address>1234 My Place</address> 
     <address2>Apt 101</address2> 
     <city>Anytown</city> 
     <state>AL</state> 
     <zip>12345</zip> 
    </shipping> 
    <orderitems> 
     <item> 
     <isbn>9780752419930</isbn> 
     <rentalterm>1</rentalterm> 
     </item> 
     <item> 
     <isbn>0495599336</isbn> 
     <rentalterm>3</rentalterm> 
     </item> 
     <item> 
     <isbn>0743500210</isbn> 
     <rentalterm>2</rentalterm> 
     </item> 
    </orderitems> 
    </order> 
</xml> 

我想要做的就是讓所有的ISBN,其中租賃期限不是2 我知道如何讓所有的ISBN:

//item/isbn/text() 

和具體租期:

//item[rentalterm!=2] 

但我不知道如何把它們放在一起。有什麼建議麼?

回答

1

只需使用:

//item[rentalterm!=2]/isbn/text() 

假設所有項目有rentalterm孩子。

3

使用該表達式:

//item[not(rentalterm='2')]/isbn/text() 

英文:得到任何isbn元素的文本節點,其母公司是不是有rentalterm孩子,其值的item元素等於2

與此表達式對比:

//item[rentalterm!=2]/isbn/text() 

...其轉換爲:獲取任何isbn元素的文本節點,其父元素爲item元素,其中至少有一個rentalterm孩子的值不等於2

換句話說,該第二表達將不匹配item元件不具有rentalterm孩子,但匹配item元件具有多個rentalterm兒童只要至少一個不具有等於2一個字符串值。

爲了把它的另一種方式,謂語[not(rentalterm='2')]可以讀作不包含rentalterm的孩子,他的字符串值等於2,而[rentalterm!=2]應該讀作包含rentalchild其字符串值不等於到2

spec describes it like this

如果要比較一個對象是一個節點集合,而另一個是一個字符串, 則比較爲真,當且僅當存在在 節點的節點 - 設置,以便對節點的字符串值和其他字符串執行比較的結果爲true。

+0

是不是比(!)更快!=? – dbinott 2011-12-15 15:58:32

+2

這不是速度問題。 `不'(rentalterm ='2')`當'item'不包含* any * child'rentalterm`的值爲`2`時返回`true`。另一方面,`rentterm!= 2`使用存在性量化,這意味着如果有任何*`rentalterm`子元素不等於`2`,那麼選擇'item`,即使還有另一個`rentalterm`,其值*是*`2`。因此,在XPath中`not`幾乎總是比'!=`更清晰(並且絕對更嚴格/更安全)。 (除非你知道你的*意思是使用`!=`;理解差異是重要的。) – 2011-12-15 16:07:52