2012-04-02 67 views
1

我想在nokogiri薩克斯解析,但是當談到解析xml元素,有一個長期和瘋狂的xml元素名稱或屬性上...然後everthing變得瘋狂。Sax解析與nokogiri奇怪的元素

如果我喜歡解析這個xml文件並獲取所有標題元素,那麼我會如何使用nokogiri-sax來做到這一點。

<titles> 
    <title xml:lang="sv">Arkivvetenskap</title> 
    <title xml:lang="en">Archival science</title> 
</titles> 

回答

4

在你的例子中,title是元素的名稱。 xml:lang="sv"是一個屬性。 這個解析器假設沒有嵌套的title元素

require 'rubygems' 
require 'nokogiri' 

class MyDocument < Nokogiri::XML::SAX::Document 
    def start_element(name, attrs) 
    @attrs = attrs 
    @content = '' 
    end 
    def end_element(name) 
    if name == 'title' 
     puts Hash[@attrs]['xml:lang'] 
     puts @content.inspect 
     @content = nil 
    end 
    end 
    def characters(string) 
    @content << string if @content 
    end 
    def cdata_block(string) 
    characters(string) 
    end 
end 

parser = Nokogiri::XML::SAX::Parser.new(MyDocument.new) 
parser.parse(DATA) 

__END__ 
<titles> 
    <title xml:lang="sv">Arkivvetenskap</title> 
    <title xml:lang="en">Archival science</title> 
</titles> 

的內部元素這將打印

sv 
"Arkivvetenskap" 
en 
"Archival science" 

SAX解析通常是太複雜。正因爲如此,我推薦Nokogiri的標準內存解析器,或者如果你真的需要的速度和內存效率,Nokogiri's Reader parser

爲了便於比較,這裏是一個標準的引入nokogiri解析器同一文檔

require 'rubygems' 
require 'nokogiri' 

doc = Nokogiri::XML(DATA) 
doc.css('title').each do |title| 
    puts title['lang'] 
    puts title.text.to_s.inspect 
end 

__END__ 
<titles> 
    <title xml:lang="sv">Arkivvetenskap</title> 
    <title xml:lang="en">Archival science</title> 
</titles> 

這裏是同一文檔

require 'rubygems' 
require 'nokogiri' 

reader = Nokogiri::XML::Reader(DATA) 
while reader.read 
    if reader.name == 'title' && reader.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT 
    puts reader.attribute('xml:lang') 
    puts reader.inner_xml.inspect # TODO xml decode this, if necessary. 
    end 
end 

__END__ 
<titles> 
    <title xml:lang="sv">Arkivvetenskap</title> 
    <title xml:lang="en">Archival science</title> 
</titles> 
+1

+1的讀者建議讀者解析器。所有的表演都沒有SAX的痛苦。 – 2012-04-03 01:30:06

+0

真棒@John Douthat,如果你要解析10.000 xml,你會推薦使用哪種類型的解析:https://gist.github.com/2282103? – SHUMAcupcake 2012-04-03 09:55:20

+1

我會使用標準的Nokogiri內存分析器。這是最簡單的代碼,並且只要文檔可以放在內存中就夠快。如果您處理的文檔太大而不適合內存,請切換到Reader解析器。 – 2012-04-03 17:44:10