要約
パース結果を配列で作られた木構造により返すパーサ。
REXML::Parsers::UltraLightParser.new でパーサオブジェクトを生成し、REXML::Parsers::UltraLightParser#parse でパースしその結果の木構造を返します。
ノードの表現
REXML::Parsers::UltraLightParser#parse が返す XML の各ノードは配列で表現されます。配列の最初の要素はシンボルでノードの種類を表わし、2番目以降の要素でそのノードの情報を保持しています。例えばテキストノードは [:text, テキスト文字列 ] という2要素の配列で表現されます。XML 要素のように子ノードを持つ場合、それらの子ノードもこの配列の要素として保持されます。
REXML::Parsers::UltraLightParser#parse の返り値となる木のルートは特別で、ノードの種類を表すシンボルを持ちません。 XML宣言、DTD、ルート要素、テキストノードの配列です。例も確認してください。木のルートの配列に含まれるテキストノードはあまり意味がないのでたいがいの場合には無視すべきでしょう。
各ノードは以下のような配列で表現されます。
- [:start_element, 親ノード, 要素名, 属性, *子ノード]
-
XML要素。属性は { 属性名文字列 => 属性値文字列 } という Hash。子ノードの配列は node[4..-1] で得られる。
- [:text, 正規化文字列]
-
テキストノード
- [:processing_instruction, ターゲット文字列, 内容文字列 | nil]
-
XML処理命令(Processing Instruction, PI)
- [:comment ,コメント文字列]
-
コメント
- [:start_doctype, 親ノード, ルート要素名, "SYSTEM" | "PUBLIC" | nil, システム識別子 | nil, 公開識別子 | nil, *子ノード]
-
DTD。子ノードの配列は node[6..-1] で得られる。
- [:attlistdecl, 要素名, 属性名とデフォルト値, 宣言文字列]
-
DTDの属性リスト宣言。属性名とデフォルト値 は { 属性名文字列 => デフォルト値文字列(なければnil) } という Hash
- [:elementdecl, 宣言文字列]
-
DTDの要素宣言
- [:entitydecl, *パラメータ]
-
DTDの実体宣言
- [:notationdecl, 記法名文字列, "PUBLIC" | "SYSTEM" | nil, 公開識別子文字列 | nil, URI文字列 | nil]
-
DTDの記法宣言
- [:cdata, テキスト文字列]
-
cdata セクション
- [:xmldecl, バージョン文字列, エンコーディング文字列 | nil, standalone ("yes" | "no" | nil)]
-
XML宣言
- [:externalentity,エンティティ文字列]
-
doctype内のパラメータ実体参照。
例
以下の例は簡単な XML をパースし、その結果を返しています。[...]の部分は親ノードを指しているので、pp の表示では省略されています。
require 'rexml/parsers/ultralightparser'
require 'pp'
parser = REXML::Parsers::UltraLightParser.new(<<XML)
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<a n="1">xyz</a>
<b m="2" />
</root>
XML
pp parser.parse
# >> [[:xmldecl, "1.0", "UTF-8", nil],
# >> [:text, "\n"],
# >> [:start_element,
# >> [...],
# >> "root",
# >> {},
# >> [:text, "\n "],
# >> [:start_element, [...], "a", {"n"=>"1"}, [:text, "xyz"]],
# >> [:text, "\n "],
# >> [:start_element, [...], "b", {"m"=>"2"}],
# >> [:text, "\n"]],
# >> [:text, "\n"]]
クラス
REXML::Parsers::UltraLightParser | パース結果を配列で作られた木構造により返すパーサクラス。 |