代码之家  ›  专栏  ›  技术社区  ›  Matt Wolfe

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

  •  2
  • Matt Wolfe  · 技术社区  · 16 年前

    好吧,我有一个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来解析它。 我想知道是否有一个合伙人以一种快速而鲁比式的惯用方式使用“某个名字”。

    假设我在一个名为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")
    

    但我觉得这个很难看。我想用枚举包括?但这仍然不起作用,因为我需要获取每个节点的.content字段,而不是实际的节点… 在写这篇文章的时候,我觉得是这样的(但它看起来有点低效,尽管很优雅)

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

    还有其他方法吗?

    3 回复  |  直到 11 年前
        1
  •  2
  •   Jose Basilio    16 年前

    这个怎么样?

    found = document.find("//partner[name='Some Name']").empty?
    
        2
  •  2
  •   Matt Wolfe    16 年前

    我尝试过这个解决方案:

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

    但我在说xpath表达式无效时出错。 但是,我在阅读一些XPath文档,看起来您可以在表达式中调用一个text()函数来获取文本节点。我尝试了以下方法,但似乎有效:

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

    发现实际上不是一个XML节点,而是一个真/假对象,因此这是有效的。

        3
  •  0
  •   paweloque    16 年前

    我将使用一种本机操作XML的语言(例如XQuery)。使用XQuery,可以以简洁而优雅的方式对XML数据进行这种查询。

    推荐文章