Ruby 使用libxml+;红宝石

Ruby 使用libxml+;红宝石,ruby,xpath,libxml2,libxml-ruby,Ruby,Xpath,Libxml2,Libxml Ruby,我正在尝试使用XPath搜索XML文件中的特定节点。这个搜索在REXML下运行得很好,但是对于大型XML文档来说,REXML太慢了。所以就转到了 我的简单示例是处理一个Yum repomd.xml文件,可以在下面找到一个示例: 我的测试脚本如下: require 'rubygems' require 'libxml' p = LibXML::XML::Parser.file( "/tmp/dr.xml") repomd = p.parse filelist = repomd.find_fir

我正在尝试使用XPath搜索XML文件中的特定节点。这个搜索在REXML下运行得很好,但是对于大型XML文档来说,REXML太慢了。所以就转到了

我的简单示例是处理一个Yum 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

查看您的代码,似乎您只想收集那些具有
href
属性的
位置
元素。如果是这种情况,下面的方法应该有效:

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

最后,我返回到REXML并使用流处理。更快更简单的XPath语法实现。

不幸的是,没有进一步的建议吗?搜索返回'nil'仍然为nil:-(filelist=repomd.find_first(//data[contains(@type,'filelist'))]/location[@href]”)put“first:”+filelist。string@MediumDaveR好的..这意味着错误:无效表达式已消失..希望您理解您的
xpath
表达式不正确..)您能给我看一下
put文件列表的输出吗?
?了解它对libxml无效(对于rexml来说是可以的,并且似乎符合标准)。代码现在是:filelist=repomd.find_first(//data[contains(@type,'filelist')]/location[@href]”)puts“first:”+文件列表输出是:/tmp/scripty.rb:7:in`+':无法将nil从/tmp/scripty.rb转换为字符串(TypeError):7@MediumDaveR你为什么不尝试?这是最好的。。