2012-04-02 66 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