class REXML::Elements

要約

要素の集合を表すクラスです。

XPath による探索をサポートします。

REXML::Element#elements はこのオブジェクトを返します。 XPath で相対パスを指定した場合は、この REXML::Element#elements のレシーバが基準要素となります。

目次

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

継承しているメソッド

Enumerableから継承しているメソッド

特異メソッド

new(parent) -> REXML::Elements[permalink][rdoc]

空の要素の集合を表すオブジェクトを生成します。

通常は REXML::Element.new によって Elements オブジェクトが生成されるため、このメソッドを使う必要はありません。

[PARAM] parant:
親要素オブジェクト

インスタンスメソッド

add(element = nil) -> REXML::Element[permalink][rdoc]
self << element = nil -> REXML::Element

要素 element を追加します。

element には文字列もしくは REXML::Element オブジェクトを指定します。文字列を指定した場合には REXML::Element.new(element) で生成される要素を追加します。

element を省略した場合は、空の要素が追加されます。

追加された要素が返されます。

[PARAM] element:
追加する要素

require 'rexml/document'
a = REXML::Element.new('a')
a.elements.add(REXML::Element.new('b'))  # => <b/>
a.to_s # => "<a><b/></a>"
a.elements.add('c') # => <c/>
a.to_s # => "<a><b/><c/></a>"
self[index, name = nil] -> REXML::Element | nil[permalink][rdoc]

index が指し示している要素を返します。

index には整数もしくは文字列を指定できます。

index に整数を指定した場合は index 番目の子要素を返します。 index は 1-origin です。つまり最初の要素の index は 1 であり、 0 ではありません。 n 番目の要素の index は n であり、 n-1 ではありません。これは XPath の仕様に合わせています。

index に文字列を指定した場合はその文字列を XPath と見なし、それで指定された要素を返します。 XPath が複数の要素を指している場合は、そのうち一つを返します。 XPath の性質上、子要素でない要素を返す場合もあります。

name は index に整数を指定した場合にのみ意味があります。 name を指定した場合 name という名前を持つ子要素の中で index 番目のものを返します。この場合も index は 1-origin です。

整数で指定した場合でも、XPathで指定した場合でも、指定した要素が存在しない場合は nil を返します。

[PARAM] index:
取り出したい要素の index (整数)もしくは xpath (文字列)
[PARAM] name:
子要素の名前(文字列)

require 'rexml/document'
doc = REXML::Document.new '<a><b/><c id="1"/><c id="2"/><d/></a>'
doc.root.elements[1]       # => <b/>
doc.root.elements['c']     # => <c id='1'/>
doc.root.elements[2,'c']   # => <c id='2'/>

doc = REXML::Document.new '<a><b><c /><a id="1"/></b></a>'
doc.root.elements["a"]     # => nil
doc.root.elements["b/a"]   # => <a id='1'/>
doc.root.elements["/a"]    # => <a> ... </>
self[index] = element[permalink][rdoc]

集合に要素 element を追加/更新します。

index で要素の更新する位置を指定します。 index には整数、文字列が指定できます。整数を指定した場合は index 番目の要素を変更します(1-originです)。文字列の場合は XPath としてマッチした要素を更新します。

整数/文字列どちらの場合でも対応する要素が存在しない場合は、末尾に追加されます。

[PARAM] index:
要素を更新する位置
[PARAM] element:
要素(REXML::Elementオブジェクト)
require 'rexml/document'
doc = REXML::Document.new '<a/>'
doc.root.elements[10] = REXML::Element.new('b')
doc.root.to_s # => "<a><b/></a>"
doc.root.elements[1] # => <b/>
doc.root.elements[1] = REXML::Element.new('c')
doc.root.to_s # => "<a><c/></a>"
doc.root.elements['c'] = REXML::Element.new('d')
doc.root.to_s # => "<a><d/></a>"
collect(xpath = nil) {|element| .. } -> [object][permalink][rdoc]

Enumerable#collect と同様、各子要素に対しブロックを呼び出し、その返り値の配列を返します。

xpath を指定した場合は、その XPath 文字列にマッチする要素に対し同様の操作をします。

[PARAM] xpath:
XPath文字列

[SEE_ALSO] REXML::Elements#each

delete(element) -> Element[permalink][rdoc]

element で指定した子要素を取り除きます。

element には、REXML::Element、整数、文字列が指定できます。 Element オブジェクトを指定した場合は、その子要素を取り除きます。整数を指定した場合には element 番目の子要素を削除します(1-originです)。文字列を指定した場合は、削除する要素を XPath で指定します。 XPathが複数の要素を指している場合は、そのうち一つを削除します。

取り除かれた要素を返します。

XPath で指定した場合、子要素ではない要素も取り除けることに注意してください。

[PARAM] element:
削除する要素(REXML::Element, 整数, 文字列)

require 'rexml/document'
doc = REXML::Document.new '<a><b/><c/><c id="1"/></a>'
b = doc.root.elements[1]
doc.root.elements.delete b           # => <b/>
doc.root.to_s                        # => "<a><c/><c id='1'/></a>"
doc.elements.delete("a/c[@id='1']")  # => <c id='1'/>
doc.root.to_s                        # => "<a><c/></a>"
doc.root.elements.delete 1           # => <c/>
doc.root.to_s                        # => "<a/>"
doc.root.elements.delete '/a'
doc.root.to_s                        # => ""
delete_all(xpath) -> [REXML::Element][permalink][rdoc]

xpath で指定した XPath 文字列にマッチする要素をすべて取り除きます。

[PARAM] xpath:
取り除く要素を指し示す XPath 文字列

require 'rexml/document'
doc = REXML::Document.new('<a><c/><c/><c/><c/></a>')
doc.elements.delete_all("a/c") # => [<c/>, <c/>, <c/>, <c/>]
doc.to_s                       # => "<a/>"
each(xpath = nil) {|element| ... } -> [REXML::Elements][permalink][rdoc]

全ての子要素に対しブロックを呼び出します。

xpath を指定した場合には、その XPath 文字列にマッチする要素に対しブロックを呼び出します。

REXML::XPath.each などとは異なり、要素以外のテキストノードなどはすべて無視されることに注意してください。

[PARAM] xpath:
XPath文字列

require 'rexml/document'
require 'rexml/xpath'
doc = REXML::Document.new '<a><b/><c/><d/>sean<b/><c/><d/></a>'
# <b/>,<c/>,<d/>,<b/>,<c/>, <d/> がブロックに渡される
doc.root.elements.each {|e|p e}
# <b/>, <b/> がブロックに渡される
doc.root.elements.each('b') {|e|p e}  #-> Yields b, b elements
# <b/>,<c/>,<d/>,<b/>,<c/>,<d/> がブロックに渡される
doc.root.elements.each('child::node()')  {|e|p e}
# <b/>,<c/>,<d/>,"sean",<b/>,<c/>,<d/> がブロックに渡される
REXML::XPath.each(doc.root, 'child::node()'){|node| p node }
empty? -> bool[permalink][rdoc]

子要素を持たない場合に true を返します。

index(element) -> Integer[permalink][rdoc]

element で指定した要素が何番目の子要素であるかを返します。

element が子要素でない場合は -1 を返します。

返り値は 1-origin です。

[PARAM] element:
インデックスを知りたい要素(REXML::Element オブジェクト)

[SEE_ALSO] REXML::Element#[]

inject(xpath = nil, initial = nil) {|element| ... } -> object[permalink][rdoc]

Enumerable#inject と同様、各子要素に対し畳み込みをします。

xpath を指定した場合は、その XPath 文字列にマッチする要素に対し同様の操作をします。

[PARAM] xpath:
XPath文字列

[SEE_ALSO] REXML::Elements#each

size -> Integer[permalink][rdoc]

保持している要素の個数を返します。

require 'rexml/document'
doc = REXML::Document.new '<a>sean<b/>elliott<b/>russell<b/></a>'
# doc.root は3つの要素と3つのテキストノードを持つため、6を返す
doc.root.size            # => 6
# そのうち要素は3つであるため、以下は3を返す
doc.root.elements.size   # => 3
to_a(xpath = nil) -> [REXML::Element][permalink][rdoc]

すべての子要素の配列を返します。

xpath を指定した場合は、その XPath 文字列にマッチする要素の配列を返します。

REXML::Elements#each と同様、REXML::XPath.match などと異なり、要素以外の子ノードは無視されます。

[PARAM] xpath:
XPath文字列

require 'rexml/document'
require 'rexml/xpath'
doc = REXML::Document.new '<a>sean<b/>elliott<c/></a>'
doc.root.elements.to_a   # => [<b/>, <c/>]
doc.root.elements.to_a("child::node()") # => [<b/>, <c/>]
REXML::XPath.match(doc.root, "child::node()") # => ["sean", <b/>, "elliott", <c/>]