よろしいですか?完全なプログラムは次のとおりです。
#!/usr/bin/ruby
require 'rexml/document'
include REXML
doc = Document.new("<data><title>This is one title</title><title>This is another title</title></data>")
XPath.each( doc, "*/title") { |element|
puts element.text
}
出力:
This is one title
This is another title
編集: OP が移動したように聞こえますが、将来の訪問者のためにここにいくつかの説明を追加する必要があると思います. 私は@LarsHの良い答えに賛成しましたが、OPの特定の入力を考えると、最初にノードを選択した結果とまったく同じ出力element.text
が生成されることに注意してください。ドキュメントから:text()
text( path = nil )
最初の子テキスト要素が存在する場合はその文字列値を返し、存在しない場合は nil を返す簡易メソッド。
元の質問で与えられたサンプル入力は<title>
、それぞれの場合に 1 つのテキスト ノードのみを含む要素を示しています。したがって、これら 2 つの方法は同じです (この場合)。
ただし、次の重要な注意事項に注意してください。
要素には複数の Text 要素が含まれる場合があり、他の子によって分離されている可能性があることに注意してください。このメソッドは最初の Text ノードのみを返すことに注意してください。
(plural)を使用して、要素のすべての子テキスト ノードを取得できます。texts()
多くの人が本当に探していると思うのは、DOM textContent
(またはその違法ないとこinnerText
) に相当するものです。Ruby でこれを行う方法は次のとおりです。
XPath.each(doc, "*/title") { |el|
puts XPath.match(el,'.//text()').join
}
これにより、各要素のすべてのテキスト子孫が 1 つの文字列に結合されます。
短い答えは、短い答えはないということです。これらのうちどれが必要かは、文脈によって大きく異なります。元の質問の唯一の要件は、「一部の xml 要素の値を配列に入れる」ことですが、これはあまり仕様ではありません。