2012-04-02 12 views
1

ノコギリでサックスパースしたいのですが、長く狂ったxml要素の名前や属性を持つxml要素を解析すると、何かが狂ってしまいます。Saxノコギリで奇妙な要素を解析する

私はこのxmlファイルを解析してすべてのタイトル要素を取りたいと思っていますが、どうすればそれをノコギリサックスで行うのですか?

<titles> 
    <title xml:lang="sv">Arkivvetenskap</title> 
    <title xml:lang="en">Archival science</title> 
</titles> 

答えて

4

この例では、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

+1のためのリーダー・パーサーです。すべてのSAXの痛みなしですべてのパフォーマンス。 –

+0

すごい@ジョンDouthat、どのような構文解析のタイプは、このような10.000 XMLを解析する場合に使用することをお勧めしますか:https://gist.github.com/2282103? – SHUMAcupcake

+1

標準のNokogiriインメモリパーサーを使用します。ドキュメントをメモリに収めることができる限り、コードを書くのが最も簡単です。大きすぎてメモリに収まらない文書を扱う場合は、Readerパーサーに切り替えます。 –

関連する問題