好吧我有一个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")
还有其他方法吗?
答案 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数据上形成这种查询。