我正在嘗試使用XPath在XML文件中搜索特定的節點。這種搜索在REXML下工作得很好,但對於大型XML文檔,REXML太慢了。於是轉移到LibXML
。使用libxml + ruby進行xpath搜索
我簡單的例子處理百勝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']/[email protected]")
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
不幸的是,沒有任何進一步的建議?搜索正在返回'nil' – MediumDaveR
@MediumDaveR請立即嘗試.. –
仍然爲零:-(filelist = repomd.find_first(「// data [contains(@ type,'filelists')]/location [@href]」) puts「First:」+ filelist.string – MediumDaveR