获取与父级同名的子节点

时间:2012-06-02 11:24:04

标签: ruby nokogiri

我需要解析父节点的所有子节点,但子节点的名称与父节点相同:

<div>
  <img></img>
  <div>
    <img></img>
  </div>
  <img></img>
</div>

我正在使用Nokogiri和Ruby,但是当我从第一个div节点执行children()时,解析会在第一个div标记处提前结束。对此有任何解决方法吗?

2 个答案:

答案 0 :(得分:1)

我几乎不愿意这么说,但这听起来像是遍历的另一个好例子:

require 'nokogiri'
html = <<EOF
<div>
  <img></img>
  <div>
    <img></img>
  </div>
  <img></img>
</div>
EOF

doc = Nokogiri::HTML html
doc.root.traverse do |node|
  if node.parent.name == node.name
    puts node
  end
end

答案 1 :(得分:1)

假设您有一个起始节点并且想要所有具有相同名称的子节点,以下是辅助方法的一些选项:

# Using Ruby to Filter
def same_kind_children(node)
  node.element_children.select{ |n| n.name==node.name }
end

# Using XPath to Filter
def same_kind_children(node)
  node.xpath(node.name)
end

# Descendants instead of Children
def same_kind_descendants(node)
  node.xpath(".//#{node.name}")
end

如果您考虑到某种特定节点,并希望找到具有相同类型父节点的该类型的每个节点:

divs_in_divs = doc.xpath('div/div')

虽然看起来不太可能,但如果您没有考虑特定的起始节点或节点名称,但想要找到与其父节点同名的所有节点,您可以这样做:

same_kind_nested = doc.xpath('//*').select{ |node| node.name==node.parent.name }