需要使用xmlpath / xmlsearch提取数据

时间:2011-12-15 15:33:58

标签: xml xpath xml-parsing

我有这个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]

但我不确定如何将它们组合在一起。有什么建议吗?

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]

spec describes it like this

  

如果要比较的一个对象是节点集而另一个是字符串,   那么当且仅当有一个节点时,比较才会成立   node-set使得执行比较的结果   节点的字符串值和另一个字符串为真。

答案 1 :(得分:1)

只需使用:

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

假设所有物品都有一个租赁儿童。