なひです。

> From: UENO Katsuhiro [mailto:unnie / blue.sky.or.jp] 
> Sent: Friday, September 20, 2002 4:33 AM

> 今更ですが、思うところがあって xmlscan の開発を再開しました。
> 
>  http://www.blue.sky.or.jp/atelier/ruby/xmlscan/

ちょうどSOAP4Rのリリース(*)直後だったので、
手抜きxmlscan対応してみました。
(*) http://www.ruby-talk.com/50761
簡単なテストでは、問題なく動いているようです。

> パーサとして機能するにはまだまだ先は長いですが、とりあえず
> 決意表明ということで :-) よろしくお願い致します。

期待してます。:) # SOAP4R的にはもう問題ないんですけど。

	/	/	/

require 'soap/parser'
require 'xmlscan/scanner'


module SOAP


class SOAPXMLScanner < SOAPParser
  def initialize( *vars )
    super( *vars )
  end

  def self.adjustKCode
    true
  end

  def prologue
    @charsetStrBackup = $KCODE.to_s.dup
  end

  def doParse( stringOrReadable )
    Scanner.new( self ).parse( stringOrReadable )
  end

  class Scanner < XMLScan::XMLScanner
    def initialize( dest )
      super()
      @dest = dest
    end

    def on_stag( name, attr )
      @dest.startElement( name, attr )
    end
  
    def on_etag( name )
      @dest.endElement( name )
    end

    def on_chardata( str )
      @dest.characters( str )
    end

    ENTITY_REF_MAP = { 'lt' => '<', 'gt' => '>', 'amp' => '&', 'quot' =>
'"', 'apos' => '\'' }
    def on_entityref( ref )
      @dest.characters( ENTITY_REF_MAP[ ref ] )
    end

    def on_charref( code )
      @dest.characters( [ Integer( code ) ].pack( "U*" ))
    end

    def on_xmldecl( decls )
      encTag = decls.find { | decl | decl[ 0 ] == 'encoding' }
      if encTag
	charsetStr = Charset.getCharsetStr( encTag[ 1 ] )
     	@charsetStrBackup = $KCODE.to_s.dup
  	$KCODE = charsetStr
	Charset.setXMLInstanceEncoding( charsetStr )
      end
    end
  end

  def epilogue
    $KCODE = @charsetStrBackup
    Charset.setXMLInstanceEncoding( $KCODE )
  end

  setFactory( self )
end


end