无法确定元素是否存在
我有一个充满嵌套item
节点的xml文档。 在大多数情况下,每个item
都有一个name
元素。 我想检查item
是否有name
元素,如果不存在则返回默认名称。
Item 1 Child Item 1 Child Item 2
当我向node.at('name')
询问没有name
元素的节点时,它会从树下面的子节点中选择下一个节点。 在上面的例子中,如果我at('name')
第二item
上询问at('name')
,我会得到"Child Item 1"
。
问题是你正在使用at()
,它可以接受CSS选择器或XPath表达式,并试图猜测你给了它。 在这种情况下,它认为name
是一个CSS选择器,它是一个后代选择器,在当前节点下面的任何地方选择name
元素。
相反,您希望使用XPath表达式仅查找子
元素。 你可以通过明确表达XPath表达式来做到这一点:
node.at('./name')
或者您可以使用at_xpath
方法来清除它:
node.at_xpath('name')
这是一个简单的工作示例:
require 'nokogiri' doc = Nokogiri.XML ' -
Item 1 -
-
Child Item 1 -
Child Item 2 ' doc.css('item').each do |item| name = item.at_xpath('name') name = name ? name.text : "DEFAULT" puts "#{item['id']} -- #{name}" end #=> a -- Item 1 #=> b -- DEFAULT #=> c -- Child Item 1 #=> d -- Child Item 2