【问题标题】:xpath search using libxml + ruby使用 libxml + ruby​​ 进行 xpath 搜索
【发布时间】:2013-08-20 09:58:40
【问题描述】:

我正在尝试使用 XPath 在 XML 文件中搜索特定节点。此搜索在 REXML 下工作得很好,但 REXML 对于大型 XML 文档来说太慢了。所以转移到LibXML

我的简单示例是处理一个 Yum repomd.xml 文件,可以在这里找到一个示例:http://mirror.san.fastserv.com/pub/linux/centos/6/os/x86_64/repodata/repomd.xml

我的测试脚本如下:

require 'rubygems'
require 'libxml'

p = LibXML::XML::Parser.file( "/tmp/dr.xml")
repomd = p.parse

filelist = repomd.find_first("/repomd/data[@type='filelists']/location@href")
puts "Length: " + filelist.length.to_s
filelist.each do |f|
   puts f.attributes['href']
end

我收到此错误:

Error: Invalid expression.
/usr/lib/ruby/gems/1.8/gems/libxml-ruby-2.7.0/lib/libxml/document.rb:123:in `find': Error: Invalid expression. (LibXML::XML::Error)
from /usr/lib/ruby/gems/1.8/gems/libxml-ruby-2.7.0/lib/libxml/document.rb:123:in `find'
from /usr/lib/ruby/gems/1.8/gems/libxml-ruby-2.7.0/lib/libxml/document.rb:130:in `find_first'
from /tmp/scripty.rb:6

我也尝试过像下面这样更简单的例子,但仍然没有骰子。

p = LibXML::XML::Parser.file( "/tmp/dr.xml")
repomd = p.parse
filelist = repomd.root.find(".//location")
puts "Length: " + filelist.length.to_s

在上述情况下,我得到了输出:

Length: 0

非常感谢您的启发指导,我已经搜索了我做错了什么,但我无法弄清楚......

这里有一些代码会获取文件并处理它,但仍然不起作用......

require 'rubygems'
require 'open-uri'
require 'libxml'

raw_xml = open('http://mirror.san.fastserv.com/pub/linux/centos/6/os/x86_64/repodata/repomd.xml').read
p = LibXML::XML::Parser.string(raw_xml)
repomd = p.parse
filelist = repomd.find_first("//data[@type='filelists']/location[@href]")
puts "First: " + filelist

【问题讨论】:

    标签: ruby xpath libxml2 libxml-ruby


    【解决方案1】:

    最后我回到了 REXML 并使用了流处理。更快、更容易的 XPath 语法实现。

    【讨论】:

      【解决方案2】:

      查看您的代码,您似乎只想收集那些具有href 属性的location 元素。如果是这种情况,应该可以:

      "//data[@type='filelists']/location[@href]"
      

      【讨论】:

      • 很遗憾没有,还有什么建议吗?搜索返回“nil”
      • 仍然没有 :-( filelist = repomd.find_first("//data[contains(@type,'filelists')]/location[@href]") puts "First:" + filelist.字符串
      • @MediumDaveR 好的..这意味着 Error: Invalid expression 现在已经消失了..所以希望您明白您的 xpath 表达式不正确..:) 你能显示我puts filelist 的输出?
      • 了解它对 libxml 无效(对 rexml 来说没问题,并且似乎符合标准)。代码现在是:filelist = repomd.find_first("//data[contains(@type,'filelists')]/location[@href]") puts "First:" + filelist 输出是:/tmp/scripty.rb: 7:in `+': can't convert nil into String (TypeError) from /tmp/scripty.rb:7
      • @MediumDaveR 为什么你不尝试nokogiri?这是最好的..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多