class REXML::Text

[edit]

要約

XML のテキストノードを表すクラスです。

注意: Ruby 2.0.0 以前では、バグのため entity_filter の機能は正しく動作しません。

目次

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

継承しているメソッド

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

特異メソッド

new(arg, respect_whitespace = false, parent = nil, raw = nil, entity_filter = nil, illegal = REXML::Text::NEEDS_A_SECOND_CHECK)[permalink][rdoc][edit]

テキストノードオブジェクトを生成します。

arg でノードの内容を指定します。文字列の場合はそれが内容として使われます。 REXML::Text オブジェクトの場合はその内容が複製されます。

respect_whitespace に真を指定すると、arg に含まれる空白文字は保存されます。偽の場合は空白はまとめられます。

raw は true, false, nil のいずれかを指定し、生成されるテキストノードが raw モードであるかどうかを決めます。 true の場合、そのノードは raw モードであると解釈され、テキストにはエスケープされていないXMLマークアップは含まれていないと仮定し、テキストの内容は変更されません。 falseの場合、そのノードは raw モードであると解釈され、 rexml はテキストに含まれているすべての(定義済み)実体をエスケープします nilの場合、親ノードが raw モードであるかどうかで self が raw モードになるかどうかが決まります。 arg に REXML::Text オブジェクトを渡した場合は、この値は無視され arg が raw モードであるかどうかが使われます。

entity_filter は置き換えたい実体のリストを文字列の配列で指定します。これは raw が false のときのみ意味を持ちます。 entity_filter が nil の場合(デフォルトの場合)、テキストがどのようにエスケープされるかは、そのノードが属する文書(REXML::Document)の DTD(REXML::DocType, REXML::Document#doctype) で定義されます。DTD が与えられていない場合は、XMLの規格上以下の実体参照/対応文字がデフォルトで使われます。

  • & &
  • &lt; <
  • &gt; >
  • &quot; "
  • &apos; '

illegal は内部用なので使わないでください。

[PARAM] arg:
テキストデータ(文字列)もしくは元データの REXML::Text オブジェクト
[PARAM] respect_whitespace:
空白を保存するかどうかを決める真偽値
[PARAM] parent:
親ノード
[PARAM] raw:
テキストのエスケープの挙動を決める値
[PARAM] entity_filter:
置換したい実体の名前の配列
[PARAM] illegal:
ライブラリ内部用
[EXCEPTION] RuntimeError:
テキストがXMLのテキストとして不正な文字を含んでいる場合に発生します。

doctype なしの場合

p REXML::Text.new("<&", false, nil, false).to_s  # => "&lt;&amp;"
p REXML::Text.new("&lt;&amp;", false, nil, false).to_s # => "&amp;lt;&amp;amp;"
p REXML::Text.new("&lt;&amp;", false, nil, true).to_s # => "&lt;&amp;"
p REXML::Text.new("<&", false, nil, true).to_s # parse error

doctype があり、実体が宣言されている場合

require 'rexml/document'
doc = REXML::Document.new(<<EOS)
doctype = REXML::Document.new(<<EOS).doctype
<!DOCTYPE root [
<!ENTITY p "foobar publisher">
<!ENTITY % q "quzz">
]>
<root />
EOS
REXML::Text.new("&quzz", false, doc.root, false).to_s # => "&amp;&q;"
REXML::Text.new("quzz", false, doc.root, true).to_s # => "quzz"
normalize(input, doctype = nil, entity_filter = nil) -> String[permalink][rdoc][edit]

input を正規化(すべての entity をエスケープ)したものを返します。

[PARAM] input:
正規化する文字列
[PARAM] doctype:
DTD(REXML::DocType オブジェクト)
[PARAM] entity_filter:
置換したい実体の名前の配列
unnormalize(string, doctype = nil, filter = nil, illegal = nil) -> String[permalink][rdoc][edit]

string を非正規化(すべての entity をアンエスケープ)したものを返します。

filter でアンエスケープしない実体の実体名を文字列配列で指定します。

[PARAM] string:
非正規化する文字列
[PARAM] doctype:
DTD(REXML::DocType オブジェクト)
[PARAM] filter:
アンエスケープしない実体の実体名(文字列配列)
[PARAM] illegal:
内部用。使わないでください。

require 'rexml/text'
REXML::Text.unnormalize("&amp; &foobar; &lt;") # => "& &foobar; <"
REXML::Text.unnormalize("&lt; &gt;", nil, ["lt"]) # => "&lt; >"

インスタンスメソッド

self <=> other -> -1 | 0 | 1[permalink][rdoc][edit]

テキストの内容を other と比較します。

[PARAM] other:
比較対象(REXML::Text オブジェクトもしくは文字列)
clone -> REXML::Text[permalink][rdoc][edit]

self を複製します。

doctype -> REXML::DocType | nil[permalink][rdoc][edit]

テキストノードが属する文書の DTD を返します。

そのような文書(REXML::Document)が存在しない、すなわちテキストノードの親ノードを辿っても REXML::Document に到達しない、場合には nil を返します。

[SEE_ALSO] REXML::DocType

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

テキストが空ならば真を返します。

node_type -> Symbol[permalink][rdoc][edit]

Symbol :text を返します。

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

"raw" モードであれば真を返します。

raw モードについては REXML::Text.new を参考にしてください。

[SEE_ALSO] REXML::Text#raw=

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

"raw" モードの設定を変更します。

raw モードについては REXML::Text.new を参考にしてください。

[PARAM] value:
設定する真偽値

[SEE_ALSO] REXML::Text#raw

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

テキストの内容を正規化(すべての実体をエスケープ)された状態で返します。

つまり返り値は XML のテキストとして妥当です。

結果は REXML::Text.new で指定した entity_filter を反映しています。

[SEE_ALSO] REXML::Text#value

require 'rexml/document'
t = REXML::Text.new("< & foobar", false, nil, false)
t.to_s # => "&lt; &amp; foobar"
t.value # => "< & foobar"
value -> String[permalink][rdoc][edit]

テキストの内容を非正規化(すべての実体をアンエスケープ)された状態で返します。

このメソッドの返り値では raw モードや entity_filter は無視されます。

[SEE_ALSO] REXML::Text#raw, REXML::Text#to_s

require 'rexml/document'
t = REXML::Text.new("< & foobar", false, nil, false)
t.to_s # => "&lt; &amp; foobar"
t.value # => "< & foobar"
value=(val)[permalink][rdoc][edit]

テキストの内容を val に変更します。

val には非正規化された(エスケープされていない)文字列を渡さなければなりません。

require 'rexml/document'
e = REXML::Element.new("a")
e.add_text("foo")
e[0].value = "bar"
e.to_s # => "<a>bar</a>"
e[0].value = "<a>"
e.to_s # => "<a>&lt;a&gt;</a>"