我有这个XML:
<?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>
我想要做的是获取所有租借期限不是2的ISBN 我知道如何获得所有ISBN:
//item/isbn/text()
和具体的租赁条款:
//item[rentalterm!=2]
但我不确定如何将它们组合在一起。有什么建议吗?
答案 0 :(得分:3)
使用此表达式:
//item[not(rentalterm='2')]/isbn/text()
英文:获取任何isbn
元素的文本节点,其中父元素是item
元素,其中rentalterm
子元素的值等于{{1} }}
与此表达式对比:
2
...转换为:获取任何//item[rentalterm!=2]/isbn/text()
元素的文本节点,其父元素是isbn
元素,其中至少有一个item
子元素,其值为不等于rentalterm
。
换句话说,第二个表达式与2
个没有item
个子元素的元素不匹配,但将匹配rentalterm
元素与多个{{1}只要至少有一个孩子的字符串值不等于item
。
换句话说,可以读取谓词rentalterm
,因为不包含字符串值等于2
的[not(rentalterm='2')]
子节点,而rentalterm
应该被理解为包含2
,其字符串值不等于[rentalterm!=2]
。
如果要比较的一个对象是节点集而另一个是字符串, 那么当且仅当有一个节点时,比较才会成立 node-set使得执行比较的结果 节点的字符串值和另一个字符串为真。
答案 1 :(得分:1)
只需使用:
//item[rentalterm!=2]/isbn/text()
假设所有物品都有一个租赁儿童。