Необходимо извлечь данные с помощью xmlpath / xmlsearch - PullRequest
1 голос
/ 15 декабря 2011

У меня есть этот 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>

Что я хочу сделать, так это получить все номера ISBN, где срок аренды не 2 Я знаю, как получить ВСЕ ISBN:

//item/isbn/text()

и особые условия аренды:

//item[rentalterm!=2]

Но я не уверен, как их соединить. Есть предложения?

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

Используйте это выражение:

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

На английском языке: Получить текстовые узлы любого элемента isbn, родительским элементом которого является элемент item, не имеющий дочернего элемента rentalterm, чейзначение равно 2

Контрастность с этим выражением:

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

... что означает: Получить текстовые узлы любого элемента isbnродителем которого является элемент item, имеющий хотя бы одного дочернего элемента rentalterm, значение которого не равно 2.

Другими словами, это второе выражение не будет соответствовать itemэлементы, у которых нет rentalterm дочерних элементов, но будет соответствовать item элементам с несколькими rentalterm дочерними элементами, если хотя бы один из них не имеет строкового значения, равного 2.

Иными словами, предикат [not(rentalterm='2')] можно прочитать, так как не содержит rentalterm потомка, строковое значение которого равно 2, тогда как [rentalterm!=2] следует читать как содержит rentalchild, строковое значение которого не равно 2.

спецификация описывает это так: :

Если один сравниваемый объект является набором узлов, а другой является строкой, то сравнение будет истинным, если и только если существует узелв наборе узлов, так что результатом выполнения сравнения строкового значения узла и другой строки является истина.

1 голос
/ 15 декабря 2011

Просто используйте:

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

при условии, что у всех предметов есть арендованный ребенок.

...