class REXML::Element

[edit]

要約

XML の要素(エレメント、element)を表すクラス。

要素は

を持つものとして特徴付けられます。

また、要素はある別の要素の子となることもできます。

目次

特異メソッド
インスタンスメソッド
定数

継承しているメソッド

REXML::Namespaceから継承しているメソッド
REXML::Parentから継承しているメソッド
Enumerableから継承しているメソッド
REXML::Childから継承しているメソッド
REXML::Nodeから継承しているメソッド

特異メソッド

new(arg = UNDEFINED, parent = nil, context = nil) -> REXML::Element[permalink][rdoc][edit]

要素オブジェクトを生成します。

arg が文字列の場合、新たな要素の名前は arg に設定されます。 arg が REXML::Element オブジェクトの場合は、新たな要素の名前、属性、context が arg のもので初期化されます。

parent で親ノードを指定します。

context には hash table で要素のコンテキストを指定します。基本的には text node (REXML::Text) での特別な文字、特に空白についての取り扱いを指定できます。以下の Symbol をハッシュのキーとして使います。

:respect_whitespace

空白を考慮して欲しい要素の名前の集合を文字列の配列で指定します。また、すべての要素で空白を考慮して欲しい場合には :all を指定します。デフォルト値は :all です。 REXML::Element#whitespace も参照してください。

:compress_whitespace

空白を無視して欲しい要素の名前の集合を文字列の配列で指定します。この指定は :respect_whitespace での指定を上書きします。すべての要素で空白を無視して欲しい場合には :all を指定します。 REXML::Element#whitespace も参照してください。

:ignore_whitespace_nodes

空白のみからなるノードを無視して欲しい要素の名前の集合を文字列の配列で指定します。すべての要素で無視して欲しい場合は :all を指定します。これが設定された場合、空白のみからなる text node は追加されません。 REXML::Element#ignore_whitespace_nodes も参照してください。

:raw

raw mode で取り扱いをして欲しい要素の名前の集合を文字列の配列で指定します。すべてのノードを raw mode で取り扱って欲しい場合は :all を指定します。 raw mode においては、text 中の特殊文字は一切変換されません。 REXML::Element#raw も参照してください。

[PARAM] arg:
要素の名前(String)もしくは初期化に使う REXML::Element オブジェクト
[PARAM] parent:
親ノード
[PARAM] context:
コンテキスト(Hash)

[SEE_ALSO] REXML::Parent.new, REXML::Child.new

インスタンスメソッド

add_attribute(key, value) -> ()[permalink][rdoc][edit]
add_attribute(attr) -> ()

要素の属性を追加します。同じ名前の属性がすでにある場合はその属性を新しい属性で置き換えます。

引数の与えかたは2通りあります。要素名と値の2つの文字列で渡す方法と REXML::Attribute オブジェクトを渡す方法です。

文字列2つで指定する場合、属性値は unnormalized な文字列を渡す必要があります。

[PARAM] key:
属性名(文字列)
[PARAM] value:
属性値(文字列)
[PARAM] attr:
属性(REXML::Attribute オブジェクト)

require 'rexml/document'
doc = REXML::Document.new("<e/>")
doc.root.add_attribute("a", "b"); doc.root # => <e a='b'/>
doc.root.add_attribute("x:a", "c"); doc.root # => <e a='b' x:a='c'/>
doc.root.add_attribute(REXML::Attribute.new("b", "d"))
doc.root # => <e a='b' x:a='c' b='d'/>
add_attributes(attrs) -> ()[permalink][rdoc][edit]

要素の属性を複数追加します。同じ名前の属性がすでにある場合はその属性を新しい属性で置き換えます。

attrs には Hash もしくは Array を指定できます。 Hash の場合は、

{ "name1" => "value1", "name2" => "value2", ... }

という形で、配列の場合は

[ ["name1", "value1"], ["name2", "value2"], ... }

という形で追加/更新する属性を指定します。

[PARAM] attrs:
追加する属性の属性名と属性値の対の集合(Array or Hash)

require 'rexml/document'
e = REXML::Element.new("e")
e.add_attributes({"a" => "b", "c" => "d"})
e # => <e a='b' c='d'/>
e = REXML::Element.new("e")
e.add_attributes([["a", "b"], ["c", "d"]])
e # => <e a='b' c='d'/>
add_element(element, attrs = nil) -> Element[permalink][rdoc][edit]

子要素を追加します。

element として追加する要素を指定します。 REXML::Element オブジェクトもしくは文字列を指定します。

element として REXML::Element オブジェクトを指定した場合、それが追加されます。文字列を指定した場合は、それを要素名とする要素を追加します。

attrs に { String => String } という Hash を渡すと、追加する要素の属性を指定できます。

子要素の最後に追加されます。

返り値は追加された要素です。

[PARAM] element:
追加する要素
[PARAM] attrs:
追加する要素に設定する属性

require 'rexml/document'
doc = REXML::Document.new('<a/>')
el = doc.root.add_element 'my-tag' # => <my-tag/>
doc.root.to_s # => "<a><my-tag/></a>"
el = doc.root.add_element 'my-tag', {'attr1'=>'val1', 'attr2'=>'val2'}
# => <my-tag attr1='val1' attr2='val2'/>
doc.root.to_s # => "<a><my-tag/><my-tag attr1='val1' attr2='val2'/></a>"
el = REXML::Element.new 'my-tag'
doc.root.add_element el # => <my-tag/>
doc.root.to_s # => "<a><my-tag/><my-tag attr1='val1' attr2='val2'/><my-tag/></a>"

[SEE_ALSO] REXML::Elements#add, REXML::Element.new

add_namespace(prefix, uri) -> self[permalink][rdoc][edit]
add_namespace(uri)

名前空間を要素に追加します。

引数が2個の場合は prefix と uri を指定します。引数が1個の場合はデフォルトの namespace の uri を指定します。

既に同じ prefix が存在する場合はそれが上書きされます。

[PARAM] prefix:
名前空間の prefix
[PARAM] uri:
名前空間の uri

require 'rexml/document'
a = REXML::Element.new("a")
a.add_namespace("xmlns:foo", "bar" )
a.add_namespace("foo", "bar")  # 上と同じ意味
a.add_namespace("twiddle")
a.to_s # => "<a xmlns:foo='bar' xmlns='twiddle'/>"
a.add_namespace("foo", "baz")
a.to_s # => "<a xmlns:foo='baz' xmlns='twiddle'/>"
attribute(name, namespace = nil) -> REXML::Attribute | nil[permalink][rdoc][edit]

name で指定される属性を返します。

属性は REXML::Attribute オブジェクトの形で返します。

name は "foo:bar" のように prefix を指定することができます。

namespace で名前空間の URI を指定することで、その名前空間内で name という属性名を持つ属性を指定できます。

指定した属性名の属性がない場合は nil を返します。

[PARAM] name:
属性名(文字列)
[PARAM] namespace:
名前空間のURI(文字列)

require 'rexml/document'

doc = REXML::Document.new(<<-EOS)
<root xmlns:foo="http://example.org/foo"
      xmlns:bar="http://example.org/bar">
  <a foo:att='1' bar:att='2' att='&lt;'/>
</root>
EOS
a = doc.get_elements("/root/a").first
a.attribute("att") # => att='&lt;'
a.attribute("att", "http://example.org/bar") # => bar:att='2'
a.attribute("bar:att") # => bar:att='2'
a.attribute("baz") # => nil
attributes -> REXML::Attributes[permalink][rdoc][edit]

要素が保持している属性の集合を返します。

cdatas -> [REXML::CData][permalink][rdoc][edit]

すべての cdata 子ノードの配列を返します。

返される配列は freeze されます。

clone -> REXML::Element[permalink][rdoc][edit]

self を複製して返します。

複製されるのは名前、属性、名前空間のみです。子ノードは複製されません。

comments -> [REXML::Comments][permalink][rdoc][edit]

すべての comment 子ノードの配列を返します。

返される配列は freeze されます。

context -> {Symbol => object} | nil[permalink][rdoc][edit]

要素の「コンテキスト」を Hash で返します。

コンテキストとは text node (REXML::Text) での特別な文字、特に空白についての取り扱いについての設定です。以下の Symbol をハッシュのキーとして使います。

:respect_whitespace

空白を考慮して欲しい要素の名前の集合を文字列の配列で指定します。また、すべての要素で空白を考慮して欲しい場合には :all を指定します。デフォルト値は :all です。 REXML::Element#whitespace も参照してください。

:compress_whitespace

空白を無視して欲しい要素の名前の集合を文字列の配列で指定します。この指定は :respect_whitespace での指定を上書きします。すべての要素で空白を無視して欲しい場合には :all を指定します。 REXML::Element#whitespace も参照してください。

:ignore_whitespace_nodes

空白のみからなるノードを無視して欲しい要素の名前の集合を文字列の配列で指定します。すべての要素で無視して欲しい場合は :all を指定します。これが設定された場合、空白のみからなる text node は追加されません。 REXML::Element#ignore_whitespace_nodes も参照してください。

:raw

raw mode で取り扱いをして欲しい要素の名前の集合を文字列の配列で指定します。すべてのノードを raw mode で取り扱って欲しい場合は :all を指定します。 raw mode においては、text 中の特殊文字は一切変換されません。 REXML::Element#raw も参照してください。

[SEE_ALSO] REXML::Element.new, REXML::Element#context=

context=(value)[permalink][rdoc][edit]

要素の「コンテキスト」を Hash で設定します。

コンテキストとは、 text node (REXML::Text) での特別な文字、特に空白についての取り扱いについての設定です。以下の Symbol をハッシュのキーとして使います。

:respect_whitespace

空白を考慮して欲しい要素の名前の集合を文字列の配列で指定します。また、すべての要素で空白を考慮して欲しい場合には :all を指定します。デフォルト値は :all です。 REXML::Element#whitespace も参照してください。

:compress_whitespace

空白を無視して欲しい要素の名前の集合を文字列の配列で指定します。この指定は :respect_whitespace での指定を上書きします。すべての要素で空白を無視して欲しい場合には :all を指定します。 REXML::Element#whitespace も参照してください。

:ignore_whitespace_nodes

空白のみからなるノードを無視して欲しい要素の名前の集合を文字列の配列で指定します。すべての要素で無視して欲しい場合は :all を指定します。これが設定された場合、空白のみからなる text node は追加されません。 REXML::Element#ignore_whitespace_nodes も参照してください。

:raw

raw mode で取り扱いをして欲しい要素の名前の集合を文字列の配列で指定します。すべてのノードを raw mode で取り扱って欲しい場合は :all を指定します。 raw mode においては、text 中の特殊文字は一切変換されません。 REXML::Element#raw も参照してください。

nil を渡すことでデフォルト値を使うよう指示できます。

[PARAM] value:
設定値

[SEE_ALSO] REXML::Element.new, REXML::Element#context

delete_attribute(key) -> REXML::Attribute | nil[permalink][rdoc][edit]

要素から key という属性名の属性を削除します。

削除された属性を返します。

key という属性名の属性が存在しない場合は削除されずに、nil を返します。

[PARAM] key:
削除する要素(文字列(属性名) or REXML::Attributeオブジェクト)

require 'rexml/document'
e = REXML::Element.new("E")
e.add_attribute("x", "foo"); e # => <E x='foo'/>
e.add_attribute("y:x", "bar"); e # => <E x='foo' y:x='bar'/>
e.delete_attribute("x"); e # => <E y:x='bar'/>
delete_element(element) -> REXML::Element[permalink][rdoc][edit]

子要素を削除します。

element で削除する要素を指定できます。整数、文字列、REXML::Element オブジェクトのいずれかが指定できます。

REXML::Element を指定すると、その要素が削除されます。整数を指定すると、element 番目の要素を削除します(1-originで指定します)。文字列を指定すると、XPath としてマッチする要素を削除します。複数の要素がマッチする場合はそのうち1つが削除されます。

[PARAM] element:
削除する要素

[SEE_ALSO] REXML::Elements#delete


require 'rexml/document'
doc = REXML::Document.new '<a><b/><c/><c id="1"/><d/><c/></a>'
doc.delete_element("/a/b")
doc.to_s # => "<a><c/><c id='1'/><d/><c/></a>"
doc.delete_element("a/c[@id='1']")
doc.to_s # => "<a><c/><d/><c/></a>"
doc.root.delete_element("c")
doc.to_s # => "<a><d/><c/></a>"
doc.root.delete_element("c")
doc.to_s # => "<a><d/></a>"
doc.root.delete_element(1)
doc.to_s # => "<a/>"
delete_namespace(namespace = "xmlns") -> self[permalink][rdoc][edit]

名前空間を要素から削除します。

削除可能な名前空間はそのノードで宣言されているもののみです。上位の要素で宣言されているものは削除できません。

引数を省略した場合はデフォルトの名前空間を削除します。

[PARAM] namespace:
削除する名前空間の prefix

require 'rexml/document'
doc = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>"
doc.root.delete_namespace
doc.to_s # => "<a xmlns:foo='bar'/>"
doc.root.delete_namespace 'foo'
doc.to_s # => "<a/>"
document -> REXML::Document | nil[permalink][rdoc][edit]

self が属する文書(REXML::Document)オブジェクトを返します。

属する文書がない場合には nil を返します。

each_element(xpath = nil) {|element| ... } -> ()[permalink][rdoc][edit]

各子要素を引数としてブロックを呼び出します。

xpath に文字列を指定するとそれにマッチする子要素のみを対象とします。

[PARAM] xpath:
XPath 文字列
each_element_with_attribute(key, value = nil, max = 0, name = nil) {|element| ... } -> ()[permalink][rdoc][edit]

特定の属性を持つすべての子要素を引数としてブロックを呼び出します。

key で指定した属性名の属性を持つ要素のみを対象とします。 value を指定すると、keyで指定した属性名を持つ属性の値がvalueであるもののみを対象とします。 maxを指定すると、対象となる子要素の先頭 max 個のみが対象となります。 name を指定すると、それは xpath 文字列と見なされ、それにマッチするもののみが対象となります。

max に 0 を指定すると、max の指定は無視されます(0個ではありません)。

[PARAM] key:
属性名(文字列)
[PARAM] value:
属性値(文字列)
[PARAM] max:
ブロック呼出の対象とする子要素の最大個数
[PARAM] name:
xpath文字列

require 'rexml/document'
doc = REXML::Document.new("<a><b id='1'/><c id='2'/><d id='1'/><e/></a>")
doc.root.each_element_with_attribute('id'){|e| p e }
# >> <b id='1'/>
# >> <c id='2'/>
# >> <d id='1'/>
doc.root.each_element_with_attribute('id', '1'){|e| p e }
# >> <b id='1'/>
# >> <d id='1'/>
doc.root.each_element_with_attribute('id', '1', 1){|e| p e }
# >> <b id='1'/>
doc.root.each_element_with_attribute('id', '1', 0, 'd'){|e| p e }
# >> <d id='1'/>
each_element_with_text(text = nil, max = 0, name = nil) {|element| ... } -> ()[permalink][rdoc][edit]

テキストを子ノードとして持つすべての子要素を引数としてブロックを呼び出します。

text を指定すると、テキストの内容が text であるもののみを対象とします。 maxを指定すると、対象となる子要素の先頭 max 個のみが対象となります。 name を指定すると、それは xpath 文字列と見なされ、それにマッチするもののみが対象となります。

max に 0 を指定すると、max の指定は無視されます(0個ではありません)。

[PARAM] text:
テキストの中身(文字列)
[PARAM] max:
ブロック呼出の対象とする子要素の最大個数
[PARAM] name:
xpath文字列

require 'rexml/document'
doc = REXML::Document.new '<a><b>b</b><c>b</c><d>d</d><e/></a>'
doc.root.each_element_with_text {|e|p e}
# >> <b> ... </>
# >> <c> ... </>
# >> <d> ... </>
doc.root.each_element_with_text('b'){|e|p e}
# >> <b> ... </>
# >> <c> ... </>
doc.root.each_element_with_text('b', 1){|e|p e}
# >> <b> ... </>
doc.root.each_element_with_text(nil, 0, 'd'){|e|p e}
# >> <d> ... </>
elements -> REXML::Elements[permalink][rdoc][edit]

要素が保持している子要素の集合を返します。

get_elements(xpath) -> [REXML::Element][permalink][rdoc][edit]

xpath にマッチする要素を配列で返します。

xpath には XPath 文字列を指定します。

[PARAM] xpath:
XPath 文字列

[SEE_ALSO] REXML::Elements#to_a

get_text(path = nil) -> REXML::Text | nil[permalink][rdoc][edit]

先頭のテキスト子ノードを返します。

raw モードの設定は無視され、常に正規化されたテキストを返します。 REXML::Text#value も参照してください。

path を渡した場合は、その XPath 文字列で指定されるテキストノードの文字列を返します。

テキストノードがない場合には nil を返します。

[PARAM] path:
XPath文字列

[SEE_ALSO] REXML::Element#text


require 'rexml/document'
doc = REXML::Document.new "<p>some text <b>this is bold!</b> more text</p>"
# doc.root (<p> ... </p>) は2つのテキストノード("some text " と " more text"
# を持っているが、前者を返す
doc.root.get_text.value # => "some text "
has_attributes? -> bool[permalink][rdoc][edit]

要素が属性を1つ以上持っていれば真を返します。

has_elements? -> bool[permalink][rdoc][edit]

self が一つでも子要素を持つならば true を返します。


require 'rexml/document'
doc = REXML::Document.new("<a><b/><c>Text</c></a>")
doc.root.has_elements?               # => true
doc.elements["/a/b"].has_elements?   # => false
# /a/c はテキストノードしか持たないので false である
doc.elements["/a/c"].has_elements?   # => false
has_text? -> bool[permalink][rdoc][edit]

要素がテキストノードを子ノードとして持つ場合に true を返します。

instructions -> [REXML::Instraction][permalink][rdoc][edit]

すべての instruction 子ノードの配列を返します。

返される配列は freeze されます。

namespace(prefix=nil) -> String[permalink][rdoc][edit]

self の文脈で prefix が指している名前空間の URI を返します。

prefix を省略すると、デフォルトの名前空間の URI を返します。

prefix で指示される名前空間の宣言が存在しない場合は nil を返します。


require 'rexml/document'
doc = REXML::Document.new("<a xmlns='1' xmlns:y='2'><b/><c xmlns:z='3'/><y:d /></a>")
b = doc.elements['//b']
b.namespace      # => "1"
b.namespace("y") # => "2"
b.namespace("z") # => nil
d = doc.elements['//y:d']
d.namespace      # => "2"
namespaces -> {String => String}[permalink][rdoc][edit]

self の文脈で定義されている名前空間の情報を返します。

対象の要素とその外側の要素で定義されている名前空間を、{ prefix => 識別子 } というハッシュテーブルで返します。


require 'rexml/document'
doc = REXML::Document.new("<a xmlns:x='1' xmlns:y='2'><b/><c xmlns:z='3'/></a>")
doc.elements['//b'].namespaces # => {"x"=>"1", "y"=>"2"}
next_element -> Element | nil[permalink][rdoc][edit]

次の兄弟要素を返します。

次の要素が存在しない場合は nil を返します。


require 'rexml/document'
doc = REXML::Document.new '<a><b/>text<c/></a>'
doc.root.elements['b'].next_element # => <c/>
doc.root.elements['c'].next_element # => nil
node_type -> Symbol[permalink][rdoc][edit]

シンボル :element を返します。

prefixes -> [String][permalink][rdoc][edit]

self の文脈で定義されている prefix を文字列の配列を返します。

対象の要素とその外側の要素で定義されている prefix を返します。


require 'rexml/document'
doc = REXML::Document.new("<a xmlns:x='1' xmlns:y='2'><b/><c xmlns:z='3'/></a>")
doc.elements['//b'].prefixes # => ["x", "y"]
previous_element -> Element | nil[permalink][rdoc][edit]

前の兄弟要素を返します。

前の要素が存在しない場合は nil を返します。

raw -> bool[permalink][rdoc][edit]

その要素が raw モードであるならば真を返します。

以下のいずれかであれば、raw モードであると判定されます。

  • REXML::Element#context の :raw が :all である
  • context の :raw の配列に self の要素名が含まれる
root -> REXML::Element[permalink][rdoc][edit]

self が属する文書のルート要素を返します。


require 'rexml/document'
doc = REXML::Document.new(<<EOS)
<root>
<children>
  <grandchildren />
</children>
</root>
EOS

children = doc.get_elements("/root/children").first
children.name # => "children"
children.root.name # => "root"
grandchildren = doc.get_elements("/root/children/grandchildren").first
grandchildren.name # => "grandchildren"
grandchildren.root.name # => "root"
root_node -> REXML::Document | REXML::Node[permalink][rdoc][edit]

self が属する文書のルートノードを返します。

通常はその要素が属する文書(REXML::Document) オブジェクトが返されます。

その要素が属する REXML::Document オブジェクトが存在しない場合は木構造上のルートノードが返されます。


require 'rexml/document'
doc = REXML::Document.new(<<EOS)
<root>
<children>
  <grandchildren />
</children>
</root>
EOS

children = doc.get_elements("/root/children").first
children.name # => "children"
children.root_node == doc # => true
grandchildren = doc.get_elements("/root/children/grandchildren").first
grandchildren.name # => "grandchildren"
grandchildren.root_node == doc # => true
text(path = nil) -> String | nil[permalink][rdoc][edit]

先頭のテキスト子ノードの文字列を返します。

テキストノードを複数保持している場合は最初のノードにしかアクセスできないことに注意してください。

raw モードの設定は無視され、常に正規化されたテキストを返します。 REXML::Text#value も参照してください。

path を渡した場合は、その XPath 文字列で指定されるテキストノードの文字列を返します。

テキストノードがない場合には nil を返します。

[PARAM] path:
XPath文字列

[SEE_ALSO] REXML::Element#get_text


require 'rexml/document'
doc = REXML::Document.new "<p>some text <b>this is bold!</b> more text</p>"
# doc.root (<p> ... </p>) は2つのテキストノード("some text " と " more text"
# を持っているが、前者を返す
doc.root.text # => "some text "
text=(text)[permalink][rdoc][edit]

「先頭の」テキストノードを text で置き換えます。

テキストノードを1つ以上保持している場合はそのうち最初のノードを置き換えます。

要素がテキストノードを保持していない場合は新たなテキストノードが追加されます。

text には文字列、REXML::Text、nil のいずれかが指定できます。 REXML::Text オブジェクトを指定した場合には、それが設定され、文字列を指定した場合には REXML::Text.new(text, whitespace(), nil, raw()) で生成される Text オブジェクトが設定されます。 nil を指定すると最初のテキストノードが削除されます。

[PARAM] text:
置き換え後のテキスト(文字列、REXML::Text, nil(削除))

require 'rexml/document'
doc = REXML::Document.new('<a><b/></a>')
doc.to_s # => "<a><b/></a>"
doc.root.text = "Foo"; doc.to_s # => "<a><b/>Foo</a>"
doc.root.text = "Bar"; doc.to_s # => "<a><b/>Bar</a>"
doc.root.add_element "c"
doc.root.text = "Baz"; doc.to_s # => "<a><b/>Baz<c/></a>"
doc.root.text = nil; doc.to_s # => "<a><b/><c/></a>"
texts -> [REXML::Texts][permalink][rdoc][edit]

すべてのテキスト子ノードの配列を返します。

返される配列は freeze されます。

whitespace -> bool[permalink][rdoc][edit]

要素(self)内で空白が考慮されるならば真を返します。

これは、

  • REXML::Element#context に :respect_whitespace も :compress_whitespace も 含まれない
  • context の :respect_whitespace に self の要素名が含まれていて、 :compress_whitespace に self の要素名が含まれていない。 「含まれている」というのには :all が指定されている場合と、 配列に含まれている場合の両方があります。

のいずれかの場合に真を返します。

要素名として REXML::Namespace#expanded_name が使われるので、名前空間の prefix は判定に影響します。

write(output = $stdout, indent = -1, transitive = false, ie_hack = false)[permalink][rdoc][edit]

このメソッドは deprecated です。 REXML::Formatter を代わりに使ってください。

output にその要素を文字列化したものを(子要素を含め)出力します。

[PARAM] output:
出力先(IO のように << で書き込めるオブジェクト)
[PARAM] indent:
インデントのスペースの数(-1 だとインデントしない)
[PARAM] transitive:
XMLではインデントのスペースでDOMが変化してしまう場合がある。これに真を渡すと、XMLのDOMに余計な要素が加わらないように空白の出力を適当に抑制するようになる
[PARAM] ie_hack:
IEはバージョンによってはXMLをちゃんと解釈できないので、それに対応したXMLを出力するかどうかを真偽値で指定する
xpath -> String[permalink][rdoc][edit]

文書上の対象の要素にのみマッチする xpath 文字列を返します。


require 'rexml/document'
doc = REXML::Document.new('<a><b/><c/></a>')
c = doc.root.elements[2] # <a> .. </a> の中の <c/> 要素
c # => <c/>
c.xpath # => "/a/c"
doc = REXML::Document.new('<a><b/><b/></a>')
b = doc.root.elements[2] # <a> .. </a> の中の2番目の <b/> 要素
b # => <b/>
b.xpath # => "/a/b[2]"

定数

UNDEFINED -> String[permalink][rdoc][edit]

"UNDEFINED" という文字列。