2

了解しました。次のようなxmlドキュメントがあります。

    <xml>
     <list>
      <partner>
       <name>Some Name</name>
       <status>active</status>
       <id>0</id>
      </partner>
      <partner>
       <name>Another Name</name>
       <status>active</status>
       <id>1</id>
      </partner>
    </list>
   </xml>

私はそれを解析するためにrubyのlib-xmlを使用しています。「SomeName」という名前のパートナーがいるかどうかをすばやくルビーな慣用的な方法で見つけたいと思います。

document ..という名前の変数でドキュメントを解析したと仮定して、これを1行またはルビーコードで行うにはどうすればよいですか。document.find(xpath)を呼び出してノードを取得できます。私はこれをわずかに異なるシナリオで複数回行う必要があり、今では私を悩ませ始めています。

私は次のことができることを知っています(しかしその醜い)

 found = false
 document.find('//partner/name').each do |name|
  if (name.content == 'Some Name')
   found = true
   break
  end
 end
 assert(found, "Some Name should have been found")

しかし、これは本当に醜いです。列挙インクルードを使用することを考えましたか?ミックスインメソッドですが、実際のノードではなく各ノードの.contentフィールドを取得する必要があるため、それでも機能しません...これを書いている間、私はこれを考えました(ただし、エレガントではありますが、多少非効率に見えます)

found = document.find('//partner/name').collect{|name| name.content}.member?("Some Name")

これを行う他の方法はありますか?

4

3 に答える 3

2

これはどうですか?

found = document.find("//partner[name='Some Name']").empty?
于 2009-04-22T22:40:54.000 に答える
2

私はこの解決策を試しました:

 found = document.find("//partner[name='Some Name']") != nil

しかし、xpath式が無効であるというエラーが発生しました。ただし、xpathのドキュメントを読んでいたところ、式でtext()関数を呼び出してテキストノードを取得できるようです。次のことを試しましたが、機能しているようです。

 found = document.find("//partner/name/text()='Some Name'")

見つかったのは実際にはxmlノードではなく、true / falseオブジェクトであるため、これは機能します。

于 2009-04-22T23:06:27.637 に答える
0

XMLでネイティブに動作する言語(たとえばXQuery)を使用します。XQueryを使用すると、xmlデータに対してこの種のクエリを簡潔かつエレガントな方法で作成できます。

于 2009-04-22T22:40:23.817 に答える