上下文:我正在使用libxml-ruby gem解析XML文件。我需要使用XPath find
方法查询XML文档中的一组节点。然后,我需要单独处理每个节点,再次使用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上下文有关,但我还没有弄清楚如何实现它。
答案 0 :(得分:2)
我看到的第一个问题是book.find("//price")
。
//price
表示“从文档的顶部开始向下看。这肯定不是你想要做的。相反,我认为你想看看book
里面的第一个{{1} }}
使用Nokogiri,我会使用CSS选择器,因为它们在眼睛上更容易,并且通常可以完成同样的事情:
price
跑完后我得到:
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