1

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   
4

1 に答える 1

0

私はばかげており、クラスではなく、適切なコールバックを使用してインスタンス#callbacks=を渡す必要があることを見逃しています。だから私がする必要があるのはすることだけでした

parser.callbacks = Callbacks.new
于 2012-10-12T21:52:14.400 に答える