(2007.12.6 ページを分けた)
Node モジュール
ChildとAttributeでincludeされます。
Ruby 1.8.6では、Attributeの next/previous_sibling_node は nilを返します (XPathと整合)。each_recursive はエラーになります (Parent辺りで定義すべき)。
- next_sibling_node
- 後方に向かって次の兄弟オブジェクトを返す。
- previous_sibling_node
- 一つ手前の兄弟オブジェクトを返す。
- each_recursive {|node| ...}
- 再帰的に子オブジェクトをブロックに渡す。
- find_first_recursive {|node| ...}
- 再帰的に子オブジェクトをブロックに渡し、最初にブロック内で真を返したノードを返す。
@ 抽象クラス Child
何かの子となるオブジェクト。直接このクラスのオブジェクトを生成することはありません。
Parent, Text, XMLDecl, Comment, AttlistDecl, Declaration, ExternalEntity, NotationDecl, Entity, Instruction のスーパークラスです。
インスタンスメソッド
- parent
- 親を返す。
- parent= other
- 親を変更する
- next_sibling= other
- otherをselfの次に挿入する。parent.insert_after self, other と同じ
- previous_sibling= other
- otherをselfの直前に挿入する。parent.insert_before self, other と同じ。
@ 抽象クラス Parent
何かの親となるオブジェクト。直接このクラスのオブジェクトを生成することはありません。ElementとDocTypeのスーパークラスです。
全体的にArrayに似たメソッドが揃っています。Arrayの要素に相当するのは直接の子です。Enumerableのメソッドも使えます。
REXMLのデザインの特徴的なところで、HTML/XMLライブラリでよくある、要素オブジェクトをハッシュに見立てて [] で属性値を得るのとは対照的です。
スーパークラス
Child
インスタンスメソッド
- add object
- push object
- << object
- object を子として末尾に追加する。selfではなく追加したobjectを返す。何という不便な。
- unshift object
- object を子として先頭に追加する。一度に追加できるobjectは一つだけ。
- delete object
- 直接の子であるobjectを切り離す。
- each {|node| ...}
- 直接の子を順にブロックに渡す。
- [index]
- indexはXPath式ではなく、整数かRangeオブジェクト。index番目 (0開始) の子を返す。
- [index] = object
- objectを子として追加する。
- index object
- 子であるobjectの位置を返す。
- size
- length
- delete_at index
- delete_if {|node| ...}
- each_index {|index| ...}
- Arrayと同じ。
- insert_before child, new_object
- childの直前にnew_objectを挿入。
- insert_after child, new_object
- childの直後にnew_objectを挿入。
- to_a
- children
- 子の配列を作って返す。子そのものはコピーしない。
- replace_child to_replace, replacement
-
- deep_clone
-
@ クラス Element
XMLデータのそれぞれの要素を表します。属性の組と内容 (子要素やテキスト) を持ちます。また、要素名は名前空間とセットになります。
Namespaceモジュールをincludeしています。
スーパークラス
Parent
クラスメソッド
- Element.new name_or_element, parent = nil, context = nil
- 新しいElementインスタンスを生成する。第一引数が文字列のときは要素名とし、Elementインスタンスのときはそれをコピーする。
インスタンスメソッド
- name
- 要素の名前 (ローカルパート = 名前空間を除いた名前) を得る。
- namespace
- この要素のXML名前空間を得る。次のスクリプトのように、親要素で名前空間が宣言されていても取得できる。
Ruby
- require 'rexml/document'
-
- doc = REXML::Document.new '<a xmlns="http://h"><b /></a>'
- e = doc.elements['//b']
- p e.class
- p e
- p e.name
- p e.namespace
入れ子になっても適切に取得できる。
Ruby
- doc = REXML::Document.new <<EOF
- <a xmlns="foo">
- <y:b xmlns:y="bar">
- <c/>
- </y:b>
- </a>
- EOF
-
- a = doc.elements['//a']
- p a.name, a.namespace
- b = doc.elements['//y:b']
- p b.name, b.namespace
- c = doc.elements['//c']
- p c.name, c.namespace
- attributes
- 属性の組を得る。Attributesインスタンス。attributes[属性名] のように使う。
- attribute name, namespace = nil
- 属性を得る。
- add_attribute key, value
- add_attribute attr
- 属性を追加する。
- add_attributes hash
- 属性を追加する。ハッシュはキー(属性名)、値(属性値)とも文字列。
- delete_attribute key
- 属性を取り除く。
- elements
- 子要素を得る。Elementsインスタンス。通常は elements[pattern]メソッドやelements.each(pattern)メソッドで、検索式patternにマッチする要素を得る。
- next_element
- この要素の次の兄弟要素を得る。next_sibling_node と違って、要素限定。
- previous_element
- この要素の前の兄弟要素を得る。previous_sibling_node と違って、要素限定。
- root
- ルート要素を返す。
- text
- 直接の子のうち、最初に出現した文字データ (Character Data) またはCDATAセクションの文字列を返す。実体参照 (<など) は変換される。
要素やコメントなどがあると、それ以降の文字データは得られない。(連結されたりしない。)
- get_text
- 直接の子のうち、最初に出現した文字データまたはCDATAセクションのオブジェクトを返す。 戻り値は Textインスタンス または CDataインスタンス。こちらは実体参照は変換されない。
- add_element name, attr_hash = nil
- 要素オブジェクトを生成し、子として末尾に追加する。
- add_text text
- 文字列text を子として追加する。
- delete_element pattern
- pattern XPath式で指定される要素を削除する。
- each_element(xpath = nil) {|node| ...}
- elements.each の別名
Documentクラス
DocumentはXML文書を表す。Documentインスタンスは次のメソッドを持つ。
スーパークラス
Element
インスタンスメソッド
- root
- ルート要素を返す。XML要素はElementクラスのインスタンス。
- xml_decl
- XML宣言を返す。
- doctype
- 文書型宣言を返す。
- write(output, indent, transitive, ie_hack)
- XML文書を出力する。
Elementsクラス
Element#elementsの戻り値はElementsインスタンスです。要素の子を探索するためにXPath式を与えます。
子に対する操作は、要素のみを対象とします。
インスタンスメソッド
- [index, name = nil]
- indexは1以上の数値。(nameが指定されていてばnameが要素名に一致する) index番目の要素を返す。
- [pattern]
- pattern XPath検索式に最初にマッチするノードオブジェクトを返す。マッチする要素がないときはnilを返す。
Elements#[]メソッドの例。目的の要素を直接取り出せる。
Ruby
- require "rexml/document"
-
- doc = nil
- File.open("xmlsample.xml") {|fp|
- doc = REXML::Document.new(fp)
- }
- puts doc.elements["hoge/foo"].attributes["bar"]
- puts doc.elements.class
- puts doc.elements["hoge/content"].class
- doc.elements["hoge/content"].each {|e|
- print "'#{e}' #<#{e.class}>\n"
- }
実行結果;
<
REXML::Elements
REXML::Element
'
' #<REXML::Text>
'<cdata>テスト' #<REXML::CData>
'
< コンテント ! !
' #<REXML::Text>
- [index] = element
- 引数indexが、
- 0以上の数値の場合は、(index + 1) 番目の要素をelementで置き換える。
- 文字列の場合は、最初にマッチする要素を置き換える。
- index element
- 子であるelementの位置 (1開始) を返す。Parent#indexと違い、要素のみを数える。
- delete pattern
- pattern XPath式に最初にマッチする要素を削除する。
- delete_all pattern
- pattern XPath式にマッチする要素をすべて削除する。
- each(pattern) {|element| ... }
- 検索式patternにマッチする要素を繰り返しブロックに渡す。
- collect(pattern) {|element| ...}
-
- size
- 子要素の数。
クラス Attributes
スーパークラス
Hash
インスタンスメソッド
- each_attribute {|attr| ...}
-
- each {|name, value| ...}
-
- get_attribute name
- 属性値を得る。名前空間を区別するため、nameは prefix:name で与える。