Sax解析与nokogiri的奇怪的元素

我想在nokogiri中进行sax-parse,但是当涉及到解析xml元素时,它会有一个长而疯狂的xml元素名称或属性…然后变得疯狂。

Fore instans如果我想解析这个xml文件并获取所有title元素,我该如何使用nokogiri-sax。

 Arkivvetenskap Archival science  

在您的示例中, 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__  Arkivvetenskap Archival science  

这打印

 sv "Arkivvetenskap" en "Archival science" 

SAX解析通常过于复杂。 因此,我推荐Nokogiri的标准内存解析器,或者如果你真的需要速度和内存效率, Nokogiri的Reader解析器 。

为了比较,这是同一文档的标准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__  Arkivvetenskap Archival science  

这是同一文档的读者解析器

 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__  Arkivvetenskap Archival science