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