XPath を取り扱うためのクラスです。
インスタンスは使わずにクラスメソッドのみを使います。
each(element, path = nil, namespaces = {}, variables = {}) {|e| ... } -> ()
[permalink][rdoc]element の path で指定した XPath 文字列にマッチする各ノードに対してブロックを呼び出します。
path に相対パスを指定した場合は element からの相対位置でマッチするノードを探します。絶対パスを指定した場合は element が属する文書のルート要素からの位置でマッチするノードを探します。 path を省略すると "*" を指定したことになります。
namespace で名前空間の対応付けを Hash で指定します。
variable で XPath 内の変数に対応する値を指定できます。 XPathインジェクション攻撃を避けるため、適切なエスケープを付加するため、に用います。
require 'rexml/document' doc = REXML::Document.new(<<EOS) <root xmlns:x='1'> <a> <b>b1</b> <x:c /> <b>b2</b> <d /> </a> <b> b3 </b> </root> EOS REXML::XPath.each(doc, "/root/a/b"){|e| p e.text } # >> "b1" # >> "b2"
first(element, path = nil, namespaces = {}, variables = {}) -> Node | nil
[permalink][rdoc]element の path で指定した XPath 文字列にマッチする最初のノードを返します。
path に相対パスを指定した場合は element からの相対位置でマッチするノードを探します。絶対パスを指定した場合は element が属する文書のルート要素からの位置でマッチするノードを探します。 path を省略すると "*" を指定したことになります。
namespace で名前空間の対応付けを指定します。
variable で XPath 内の変数に対応する値を指定できます。 XPathインジェクション攻撃を避けるため、適切なエスケープを付加するため、に用います。
マッチするノードがない場合には nil を返します。
require 'rexml/document' doc = REXML::Document.new(<<EOS) <root xmlns:x='1'> <a> <b>b1</b> <x:c /> <b>b2</b> <d /> </a> <b> b3 </b> </root> EOS a = doc.root.elements[1] # => <a> ... </> b1 = REXML::XPath.first(a, "b") b1.text # => "b1" REXML::XPath.first(doc, "/root/a/x:c") # => <x:c/> REXML::XPath.first(a, "x:c") # => <x:c/> REXML::XPath.first(a, "y:c") # => nil REXML::XPath.first(a, "y:c", {"y" => "1"}) # => <x:c/> b2 = REXML::XPath.first(doc, "/root/a/b[text()=$v]", {}, {"v" => "b2"}) b2 # => <b> ... </> b2.text # => "b2"
match(element, path = nil, namespaces = {}, variables = {}) -> [Node]
[permalink][rdoc]element の path で指定した XPath 文字列にマッチするノードの配列を返します。
path に相対パスを指定した場合は element からの相対位置でマッチするノードを探します。絶対パスを指定した場合は element が属する文書のルート要素からの位置でマッチするノードを探します。 path を省略すると "*" を指定したことになります。
namespace で名前空間の対応付けを Hash で指定します。
variable で XPath 内の変数に対応する値を指定できます。 XPathインジェクション攻撃を避けるため、適切なエスケープを付加するため、に用います。
require 'rexml/document' doc = REXML::Document.new(<<EOS) <root xmlns:x='1'> <a> <b>b1</b> <x:c /> <b>b2</b> <d /> </a> <b> b3 </b> </root> EOS REXML::XPath.match(doc, "/root/a/b") # => [<b> ... </>, <b> ... </>]