【问题标题】:LIBXML-RUBY > Xpath contextLIBXML-RUBY > Xpath 上下文
【发布时间】:2013-06-12 22:39:48
【问题描述】:

上下文:我正在使用 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 上下文有关,但我还没有想出如何完成它。

【问题讨论】:

  • 我强烈建议您使用 Nokogiri 进行 XML 解析。这是 Ruby 的事实标准。
  • 我实际上开始使用 Nokogiri 并遇到了同样的问题。我切换到 libxml-ruby 希望那里的情况会有所不同,但同样的问题仍然存在。
  • 嗯...当问题出现时,您知道它不在库中。 :-) 去过那里,做过太多次记不住了。坚持Nokogiri;它摇摆不定。

标签: ruby libxml-ruby


【解决方案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

【讨论】:

  • 啊,你是对的。我错误地认为这会导致查询从节点的顶部开始,而不是从文档开始。只需删除价格前面的“//”即可解决此问题。感谢您的帮助!
  • 正确。这也是我喜欢 CSS 的原因之一。 XPath 中的斜线让我的大脑感到疲倦。
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多