Xpath извлекает определенные узлы без их дочерних узлов из XML

У меня есть данные XML, которые выглядят так

<priceData>
  <div class='price'>
    <div class='price-old'>20.00</div>
    <div class='price-new'>10.00</div>
    <div class='price-tax'>8.00</div>
  </div>
  <div class='price'>
    40.00 <div class='price-tax'>25.00</div>
  </div>
 </priceData>

Я хочу использовать Xpath для извлечения данных для «новой цены» из первого ценового сегмента и значения 40,00 из второго ценового сегмента. Это должно быть сделано с помощью одного выражения.

Я пробовал такие выражения, как

//div[contains(@class, 'price') and not(contains(@class, 'tax')) and not(contains(@class, '-old'))]

и

//div[contains(@class, 'price') and not(contains(@class, 'tax')) and not(descendant::div[contains(@class, '-old') and not(contains(@class, '-tax'))]) and not(contains(@class, '-old'))]

и некоторые другие, но я не могу заставить его работать так, как он должен. Я всегда получаю дополнительные узлы из первого случая, и мне нужен только один узел (цена-новая или цена, если в нем больше нет узлов).


person humra    schedule 06.05.2015    source источник
comment
Какой именно результат вам нужен? Набор узлов с двумя текстовыми узлами?   -  person nwellnhof    schedule 06.05.2015
comment
Да, два текстовых узла. По одному от каждого случая.   -  person humra    schedule 06.05.2015


Ответы (1)


Вы можете попробовать использовать объединение xpath (|), чтобы объединить 2 запроса в один. Учитывая разметку в вопросе как ввод XML, следующий xpath (отформатированный для удобочитаемости):

//div[@class='price']/div[@class='price-new']/text()
    | 
//div[@class='price']/text()[normalize-space()]

вернул «ожидаемый» результат в xpath tester:

Text='10.00'
Text='40.00'
person har07    schedule 06.05.2015