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 来解析它。我想以一种快速而惯用的方式来查找是否有一个名为“Some Name”的合作伙伴。

假设我在一个名为 document.. 的变量中解析了一个文档,我该如何在一行或 ruby​​ 代码中做到这一点。这样我就可以调用 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")

但我觉得这真的很难看。我想过使用枚举包括?mixin 方法,但这仍然行不通,因为我需要获取每个节点的 .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'")

found 实际上不是一个 xml 节点,而是一个真/假对象,所以这是可行的。

于 2009-04-22T23:06:27.637 回答
0

我会使用一种在 XML 上运行的语言(例如 XQuery)。使用 XQuery,可以以简洁优雅的方式对 xml 数据进行此类查询。

于 2009-04-22T22:40:23.817 回答