在Nokogiri XML中注释掉一个节点?

时间:2015-04-14 14:17:02

标签: ruby xml nokogiri

目前我正在使用以下方式删除窗帘节点:

doc.search('//xpathExpression').each do |node|
    node.remove
end

但是,我真的需要注释掉节点而不是删除节点。有没有一种简单的方法可以将节点类型/注释更改为当前节点?

1 个答案:

答案 0 :(得分:0)

为了给予应有的信用,这是原始用户在上述评论中建议的方法。

执行以下操作以基于xpath注释掉一个或多个节点:

  1. 使用.xpath方法查找目标节点。
  2. 使用在注释对象中转换为字符串的节点副本重新编辑已重新调整的每个节点。
  3. 删除原始节点。
  4. 例如,给定:

    #!/usr/bin/env ruby 
    
    require "nokogiri"
    
    xml = %{
    <top>
      <child num="1"/>
      <child num="2"/>
    </top>
    }
    
    doc = Nokogiri::XML(xml)
    

    此代码将根据<child>属性注释掉第二个num="2"

    doc.xpath("//top/child[@num='2']").each do |node|
      node.add_previous_sibling( Nokogiri::XML::Comment.new(doc, " #{node.to_s} ") ) 
      node.remove
    end
    

    在此过程之后,doc.to_xml将是:

    <?xml version="1.0"?>
    <top>
      <child num="1"/>
      <!-- <child num="2"/> -->
    </top>
    

    其他信息:

    • Nokogiri发表的评论在<!---->令牌之间没有空格,也没有添加任何内容。上面的示例添加了前导和尾随空格。如果这不是问题,可以使用

      输出节点
      Nokogiri::XML::Comment.new(doc, node.to_s)
      
    • 在评论中似乎没有直接进行自动漂亮打印。虽然可能有办法绕过它,但是如果你关注美学,那就准备花一些时间来搞乱它。