Nokogiri:递归地合并邻居文本节点?

时间:2010-09-10 20:38:24

标签: ruby nokogiri

我有一个准备好的Nokogiri页面,其中删除了垃圾......但文本部分仍然存储在不同的节点中......

我想要做的是将所有直接邻居文本节点连接到一个单个文本节点......

我想出了什么:

#merge neighbour text nodes -> connect content
def merge_text_nodes(node)
  previoustext = false
  node.children.each_with_index do |item,i|
    if item.name != 'text()'
      merge_text_nodes(item)
      previoustext = false
    else
      if previoustext
        node.children[i-1].inner_html += item.inner_html
        item.remove
      end
      previoustext = true
    end
  end
end

但它似乎没有按预期工作 - 它似乎什么都不做......有人可以告诉我如何正确地做/向我显示错误/正确的方法吗?

2 个答案:

答案 0 :(得分:2)

好的,最后我自己做对了:

def merge_text_nodes(node)
  prev_is_text = false

  newnodes = []
  node.children.each do |element|
    if element.text?
      if prev_is_text
        newnodes[-1].content += element.text
      else
        newnodes << element
      end
      element.remove
      prev_is_text = true
    else
      newnodes << merge_text_nodes(element)
      element.remove
      prev_is_text = false
    end
  end

  node.children.remove
  newnodes.each do |item|
    node.add_child(item)
  end

  return node
end

答案 1 :(得分:0)

这个问题的一个有趣的解决方案可能如下:

xml # your Nokogiri XML object, with unmerged text nodes
xml = Nokogiri::XML(xml.to_xml)

从字符串重新解析XML会导致相邻的文本节点合并为副作用。