在你的例子中,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的讀者建議讀者解析器。所有的表演都沒有SAX的痛苦。 – 2012-04-03 01:30:06
真棒@John Douthat,如果你要解析10.000 xml,你會推薦使用哪種類型的解析:https://gist.github.com/2282103? – SHUMAcupcake 2012-04-03 09:55:20
我會使用標準的Nokogiri內存分析器。這是最簡單的代碼,並且只要文檔可以放在內存中就夠快。如果您處理的文檔太大而不適合內存,請切換到Reader解析器。 – 2012-04-03 17:44:10