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