REXMLリファレンス

(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
  1. require 'rexml/document'
  2. doc = REXML::Document.new '<a xmlns="http://h"><b /></a>'
  3. e = doc.elements['//b']
  4. p e.class #=> REXML::Element
  5. p e #=> <b/>
  6. p e.name #=> "b"
  7. p e.namespace #=> "http://h"

入れ子になっても適切に取得できる。

Ruby
  1. doc = REXML::Document.new <<EOF
  2. <a xmlns="foo">
  3. <y:b xmlns:y="bar">
  4. <c/>
  5. </y:b>
  6. </a>
  7. EOF
  8. a = doc.elements['//a']
  9. p a.name, a.namespace #=> "a" "foo"
  10. b = doc.elements['//y:b']
  11. p b.name, b.namespace #=> "b" "bar"
  12. c = doc.elements['//c']
  13. p c.name, c.namespace #=> "c" "foo"
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セクションの文字列を返す。実体参照 (&lt;など) は変換される。

要素やコメントなどがあると、それ以降の文字データは得られない。(連結されたりしない。)

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
  1. require "rexml/document"
  2. doc = nil
  3. File.open("xmlsample.xml") {|fp|
  4. doc = REXML::Document.new(fp)
  5. }
  6. puts doc.elements["hoge/foo"].attributes["bar"]
  7. puts doc.elements.class
  8. puts doc.elements["hoge/content"].class
  9. doc.elements["hoge/content"].each {|e|
  10. print "'#{e}' #<#{e.class}>\n"
  11. }
実行結果;
<
REXML::Elements
REXML::Element
'
 ' #<REXML::Text>
'<cdata>テスト' #<REXML::CData>
'
 < コンテント &#33; &#x21;
 ' #<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 で与える。