无法确定元素是否存在

我有一个充满嵌套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