xmlscan は Ruby だけで書かれた non-validating XML parser です。
次のような特長があります。
デフォルトでは、xmlscan がどの CES (Character Encoding Scheme) で XML文書を解析するかはグローバル変数 $KCODE の値によって決まります。 EUC-*, Shift_JIS, UTF-8 で書かれたXML文書を解析するには $KCODE や XMLScan::XMLScanner#kcode= に適切な値を設定する必要があります。
UTF-16 は直接サポートしていません。解析前に一旦 UTF-8 に変換する 必要があります。
XML名前空間は xmlscan/namespace.rb で実装されていますが、インターフェースを 大きく変更する予定があるため undocumented とします。
xmlscan に関する全ての例外のスーパークラス。
これらの例外は、XMLScan::Visitor のインスタンスが、XMLScan::XMLScanner や XMLScan::XMLParser からエラー報告を受け取ったときに、デフォルトで発生させる ものです。各パーサが直接これらの例外を投げることはありません。
XML文書の解析結果を受け取るための Mix-in です。
xmlscan に含まれる各 parser は、文書の先頭から構文解析を行い、タグ等の 構文要素を見つけるたびに、パーサに与えられた XMLScan::Visitor の インスタンスの特定のメソッドを呼び出します。この呼び出しは、必ず文書の 先頭から順番に行われます。
特に記述の無い限り、各メソッドはデフォルトでは何もしません。
XMLScan::Visitor#parse_error(msg)XMLScan::Visitor#wellformed_error(msg)XMLScan::Visitor#valid_error(msg)妥当性制約違反を発見した場合に呼び出されます。デフォルトでは XMLScan::NotValidError例外を発生させます。例外処理等の 大域脱出を行わずに普通に制御をパーサに返すと、パーサはエラーを 回復して解析を続けます。
なお、現在の xmlscan には妥当性を検証するXMLプロセサは 含まれていません。このメソッドは将来の版のために予約されています。
XMLScan::Visitor#warning(msg)XMLScan::Visitor#on_start_documentXMLScan::Visitor#on_end_documentXMLScan::Visitor#on_xmldeclXMLScan::Visitor#on_xmldecl_version(str)XMLScan::Visitor#on_xmldecl_encoding(str)XMLScan::Visitor#on_xmldecl_standalone(str)XMLScan::Visitor#on_xmldecl_other(name, value)XMLScan::Visitor#on_xmldecl_endXML宣言を発見した場合に呼び出されます。
<?xml version="1.0" encoding="euc-jp" standalone="yes" ?>
^ ^ ^ ^ ^
1 2 3 4 5
method argument
--------------------------------------
1: on_xmldecl
2: on_xmldecl_version ("1.0")
3: on_xmldecl_encoding ("euc-jp")
4: on_xmldecl_standalone ("yes")
5: on_xmldecl_end
XML宣言を発見した場合、on_xmldecl と on_xmldecl_end は必ず 呼び出されます。他のメソッドは対応する構文がXML宣言中に 現れなかった場合は呼び出されません。
on_xmldecl_other は version, encoding, standalone 以外の宣言が XML宣言の中にあった場合に呼び出されます。そのような宣言は構文上 許されていないため、on_xmldecl_other が呼び出される前には必ず XMLScan::Visitor#parse_error メソッドが呼び出されることに 注意して下さい。
XMLScan::Visitor#on_doctype(root, pubid, sysid)文書型宣言を発見した場合に呼び出されます。
document argument
--------------------------------------------------------------
1: <!DOCTYPE foo> ('foo', nil, nil)
2: <!DOCTYPE foo SYSTEM "bar"> ('foo', nil, 'bar')
3: <!DOCTYPE foo PUBLIC "bar"> ('foo', 'bar', nil )
4: <!DOCTYPE foo PUBLIC "bar" "baz"> ('foo', 'bar', 'baz')XMLScan::Visitor#on_prolog_space(str)XMLScan::Visitor#on_comment(str)XMLScan::Visitor#on_pi(target, pi)XMLScan::Visitor#on_chardata(str)XMLScan::Visitor#on_cdata(str)XMLScan::Visitor#on_entityref(ref)XMLScan::Visitor#on_charref(code)XMLScan::Visitor#on_charref_hex(code)XMLScan::Visitor#on_stag(name)XMLScan::Visitor#on_attribute(name)XMLScan::Visitor#on_attr_value(str)XMLScan::Visitor#on_attr_entityref(ref)XMLScan::Visitor#on_attr_charref(code)XMLScan::Visitor#on_attr_charref_hex(code)XMLScan::Visitor#on_attribute_end(name)XMLScan::Visitor#on_stag_end_empty(name)XMLScan::Visitor#on_stag_end(name)開始タグを発見した場合に呼び出されます。
<hoge fuga="foo&bar;&&baz" >
^ ^ ^ ^ ^ ^ ^ ^ ^
1 2 3 4 5 6 7 8 9
method argument
------------------------------------
1: on_stag ('hoge')
2: on_attribute ('fuga')
3: on_attr_value ('foo')
4: on_attr_entityref ('bar')
5: on_attr_charref (38)
6: on_attr_charref_hex (38)
7: on_attr_value ('baz')
8: on_attribute_end ('fuga')
9: on_stag_end ('hoge')
or
on_stag_end_empty ('hoge')
開始タグを発見した場合、on_stag と、対応する on_stag_end 又は on_stag_end_empty は必ず呼び出されます。他のメソッドは、開始タグの 中に属性が現れなかった場合は呼び出されません。
属性を発見した場合、on_attribute と on_attribute_end は必ず 呼び出されます。属性値が空 (fuga="") の時は、この2つのメソッドのみが 呼び出されます。
on_attr_entityref は属性値の中で一般実体参照を発見した場合に 呼び出されます。on_charref 及び on_charref_hex は属性値の中で 文字参照を発見した場合に呼び出されます。
タグが空要素タグだった場合は、on_stag_end メソッドの代わりに on_stag_end_empty メソッドが呼び出されます。
XMLScan::Visitor#on_etag(name)XML文書を字句解析し、タグ等を認識するスキャナです。
XMLScan::XMLScanner の規格適合性については、他の文書で述べています。
XMLScan::XMLScanner.new(visitor[, option ...])XMLScan::XMLScanner オブジェクトを生成します。visitorは XMLScan::Visitor のインスタンスで、XMLScan::XMLScanner オブジェクトから 解析結果を受け取ります。
optionは文字列又はシンボルで指定します。optionには 次のものがあります。
require 'xmlscan/xmlchar' すると指定できるようになります。
不正な文字が使われていないかどうかのチェックを行います。
パフォーマンスが著しく低下します。
XMLScan::XMLScanner#kcode= argXMLScan::XMLScanner#kcodeXMLScan::XMLScanner#parse(source)妥当性を検証しない XML parser です。
XMLScan::XMLParser の規格適合性については、他の文書で述べています。
XMLScan::XMLParser.new(visitor[, option ...])XMLScan::XMLParser オブジェクトはvisitorの各メソッドについて、 次のことを保証します。
加えて、エラー回復を行わなければ、整形式のXML文書では起こり得ない メソッド呼び出しは全て抑制されます。
XMLScan::XMLScanner を元にした HTML パーサです。
XMLScan::HTMLScanner の規格適合性については、他の文書で述べています。
XMLScan::HTMLScanner.new(visitor[, option ...])