LIBXML-RUBY > Контекст Xpath

Контекст: я анализирую XML-файл, используя гем libxml-ruby. Мне нужно запросить документ XML для набора узлов, используя XPath find метод. Затем мне нужно обработать каждый узел по отдельности, запрашивая их еще раз, используя XPath find метод.

Проблема: когда я пытаюсь запросить возвращенные узлы индивидуально, XPath find Метод запрашивает весь документ, а не только узел:

Пример кода:

require 'xml'

string = %{<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>}

xml = XML::Parser.string(string, :encoding => XML::Encoding::ISO_8859_1).parse
books = xml.find("//book")
books.each do |book|
    price = book.find("//price").first.content
    puts price
end

Этот скрипт возвращает 29.99 дважды. Я думаю, что это должно быть связано с настройкой контекста XPath, но я еще не выяснил, как этого добиться.

1 ответ

Решение

Первая проблема, которую я вижу, это book.find("//price"),

//price означает "начать сверху документа и смотреть вниз. Это, безусловно, НЕ то, что вы хотите сделать. Вместо этого я думаю, что вы хотите заглянуть внутрь book для первого price,

Используя Nokogiri, я бы использовал CSS-селекторы, потому что они более удобны для глаз и обычно могут выполнять одно и то же:

require 'nokogiri'

string = %{<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>}

xml = Nokogiri::XML(string)
books = xml.search("book")
books.each do |book|
    price = book.at("price").content
    puts price
end

После запуска я получаю:

29.99
39.95
Другие вопросы по тегам