2009-04-22 49 views
2

好吧,我有一个XML文档看起来是这样的:遍历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> 

我使用红宝石的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") 

还有其他的方法吗?

回答

2

这是怎么回事?

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

我会使用本地操作XML的语言(例如XQuery)。使用XQuery,可以通过简洁和优雅的方式来制定这种通过xml数据进行的查询。

2

我试过这个解决方案:

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

但我得到了一个错误说XPath表达式是无效的。 但是,我正在阅读一些xpath文档,它看起来像你可以在表达式中调用text()函数来获取文本节点。我试过以下,它似乎工作:

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

居然发现不是XML节点,但真/假对象,因此这个工程。

+1

第一个XPath适用于libxml-ruby和Nokogiri,所以我不确定它为什么会给你一个无效的XPath错误。值得注意的是,'!= nil`可能无法达到你想要的效果 - 即使在没有匹配的情况下,你也会收到回收。你可能想要使用.empty?检查是否有任何东西被发现。 – 2009-04-22 23:33:11