libxml の SAX パーサーを使用しようとしています (ここに示されているように) が、未定義のメソッド エラーが発生します。
私のコードは
$domain_topics = Hash.new { |h,d| h[d] = [] }
parser = LibXML::XML::SaxParser.io(
File.open("content.rdf.u8", "r:UTF-8")
)
class Callbacks
include LibXML::XML::SaxParser::Callbacks
def initialize
@state = :top
@topics = nil
end
def on_start_element(element, attributes)
case @state
when :top
return unless element == 'ExternalPage'
@state = :ExternalPage
domain = attributes['about'].sub(%r!^\w+://([^"/]*)(?:/[^"]*)?$!, '\1')
@topics = $domain_topics[domain]
when :ExternalPage
return unless element == 'topic'
@state = :topic
end
end
def on_characters(characters)
if @state == :topic and @topics
@topics << characters
end
end
def on_end_element(element)
case @state
when :ExternalPage
@state = :top
@topics = nil
when :topic
@state = :ExternalPage
end
end
end
parser.callbacks = Callbacks
parser.parse
そして、私がそれを実行すると:
% ./my_awesome_code.rb
./my_awesome_code.rb:1337:in `parse': undefined method `on_start_document' for Callbacks:Class (NoMethodError)
ここで何が間違っていますか?include
LibXML::XML::SaxParser::Callbacks
のデフォルト定義を与える
べきではありませんon_start_document
か?
irb は私の直感を確認しているようです:
1.9.3p194 :009 > Callbacks.instance_methods.include? :on_start_document
=> true