この例では、title
が要素の名前です。 xml:lang="sv"
は属性です。 このパーサはこれが
sv
"Arkivvetenskap"
en
"Archival science"
SAX解析を印刷し、タイトル要素の内
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>
をネストされた要素がないと仮定し、通常はあまりにも複雑です。そのため、Nokogiriの標準メモリ内パーサをお勧めします。の場合、実際にには速度とメモリ効率が必要です。Nokogiri's Reader parser。比較のために
は、ここで同じ文書
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の痛みなしですべてのパフォーマンス。 –
すごい@ジョンDouthat、どのような構文解析のタイプは、このような10.000 XMLを解析する場合に使用することをお勧めしますか:https://gist.github.com/2282103? – SHUMAcupcake
標準のNokogiriインメモリパーサーを使用します。ドキュメントをメモリに収めることができる限り、コードを書くのが最も簡単です。大きすぎてメモリに収まらない文書を扱う場合は、Readerパーサーに切り替えます。 –