From: Makoto Sato Date: 2001-06-06T17:22:57+09:00 Subject: [ruby-list:30118] Re: xmlparser について(初心者) 佐藤@NGBです。 ご法度かなとも思ったのですが、xml-users MLにも 同じ質問を投げていたところ、よしだむさん、山本もぐさんに レスをもらい、解決しました。 XMLParserを継承したクラスに、character(data)メソッドを追加し、 インスタンス変数をフラグのように使って、フラグがtrueならば、 出力、そうでなければ出力しないという方法で解決しました。 解決後のスクリプトは以下のとおりです。 1 #!/usr/local/bin/ruby -Ke 2 3 require 'xmlparser' 4 5 class NewParser < XMLParser 6 def initialize 7 @elemNames = [] 8 @start = false 9 @data = '' 10 end 11 12 def startElement(name, attrs) 13 if name == "start" 14 @start = true 15 @data = '' 16 end 17 end 18 19 def endElement(name) 20 if @start 21 print @data, "\n" 22 @start = false 23 end 24 end 25 26 def character(data) 27 if @start 28 @data << data 29 end 30 end 31 end 32 33 parser = NewParser.new 34 35 begin 36 parser.parse($<.read) 37 rescue 38 print "Error: #{$!} in line #{parser.line}\n" 39 end ~ Makoto Sato wrote: > > 佐藤@NGBです。 > > 吉田正人さんのRuby用XMLParserを使い始めたところなのですが、 > 開始タグと終了タグにはさまれたテキスト部分の抽出の仕方が > 分からず、はまっています。 > > XMLParserクラスを継承して、イベントハンドラstartElementの > 中でdefaultCurrentを呼んでみたのですが、defaultイベントハンドラが > そのタグの終了タグや次の開始タグも飛び越えてしまっているようです。 > > 下記のcopy-dat.xmlからとにはさまれたテキストのみ > 抽出したいのですが、どのようにイベントハンドラを定義したら > 良いのでしょうか? > > ===copy-dat.xml=== > > > > > > 4562596 > 6167568 > > > 3389208 > 4890334 > > > 116531 > 6158049 > > > ........ > ================== > > ===copy-dat.rb==== > 1 #!/usr/local/bin/ruby -Ke > 2 > 3 require 'xmlparser' > 4 > 5 class NewParser < XMLParser > 6 def initialize > 7 @elemNames = [] > 8 end > 9 > 10 def startElement(name, attrs) > 11 if name == "start" > 12 defaultCurrent > 13 end > 14 end > 15 > 16 def endElement(name) > 17 end > 18 > 19 def elemNames > 20 @elemNames > 21 end > 22 > 23 def default(data) > 24 print data > 25 end > 26 end > 27 > 28 parser = NewParser.new > 29 > 30 begin > 31 parser.parse($<.read) > 32 rescue XMLParserError > 33 print "Error: #{$!} in line #{parser.line}\n" > 34 end > 35__END__ ======================== 佐藤誠@NGB Corporation