遍历xml结构以确定某个文本节点是否存在

时间:2009-04-22 22:32:18

标签: ruby xml enumeration

好吧我有一个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”的合作伙伴。

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

还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

这个怎么样?

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

答案 1 :(得分:2)

我尝试了这个解决方案:

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

但是我收到一条错误,说xpath表达式无效。 但是,我正在阅读一些xpath文档,看起来你可以在表达式中调用text()函数来获取文本节点。我尝试了以下内容,似乎有效:

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

发现实际上不是一个xml节点,而是一个真/假对象,所以这是有效的。

答案 2 :(得分:0)

我会使用一种本地操作XML的语言(例如XQuery)。使用XQuery,可以以简洁优雅的方式在xml数据上形成这种查询。