2013-08-20 58 views
0

我正在嘗試使用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 

回答

1

最後我恢復到REXML和使用流處理。 XPath語法實現更快更簡單。

0

看着你的代碼,看起來你只想收集那些具有href屬性的location元素。如果是這種情況下應該工作:

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

不幸的是,沒有任何進一步的建議?搜索正在返回'nil' – MediumDaveR

+0

@MediumDaveR請立即嘗試.. –

+0

仍然爲零:-(filelist = repomd.find_first(「// data [contains(@ type,'filelists')]/location [@href]」) puts「First:」+ filelist.string – MediumDaveR