1

rexml を使用して、いくつかの xml 要素の値を配列に入れようとしています。これが私がやっていることの例です:

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
}

ただし、次のように出力されます。

[<title> ... </>, <title> ... </>] 

「これは1つのタイトルです」と「これは別のタイトルです」を含む配列を出力するにはどうすればよいですか?

4

2 に答える 2

4

リクエストごとに、コメントを回答に移動します。

putsとにかくその引数をその引数を文字列に変換することができますが、最初に XPath にテキスト ノードを返すようにさせることができます。

XPath.each(doc, "*/title/text()") {...
于 2011-11-18T15:07:36.903 に答える
3

よろしいですか?完全なプログラムは次のとおりです。

#!/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 要素の値を配列に入れる」ことですが、これはあまり仕様ではありません。

于 2011-11-17T23:32:54.543 に答える