2011-12-15 55 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