【问题标题】:Nokogiri: non-destructively print node without its childrenNokogiri:没有子节点的非破坏性打印节点
【发布时间】:2020-08-08 17:29:30
【问题描述】:

我有一段 ruby​​ 代码来替换属性的值:

# -*- coding: utf-8 -*-
require "nokogiri"
    
xml = <<-eos
<a blubb="blah">
  <b>irrelevant</b>
  <b>also irrelevant</b>
  <b blubb="blah">
    <c>irrelevant</c>
    <c>irrelevant</c>
  </b>
  <b blubb="foo">
    <c>irrelevant</c>
    <c>irrelevant</c>
  </b>
</a>
eos

doc = Nokogiri::XML(xml) { |config| config.noent }
doc.xpath("//*[@blubb='blah']").each {|node|
  puts "Node before:\n#{node.to_s}" ## replace me!
  node['blubb'] = "NEW"
  puts "Node after:\n#{node.to_s}" ## replace me!
}

当我执行这段代码时,我打印了整个node 元素,但我只需要查看开始标记来确认我的脚本工作正常。有没有办法只显示node 的开始标签,或者至少只显示没有子节点的元素本身?重要的是节点本身在打印时不会改变(除了属性中的替换),因此删除子节点不是一种选择!

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

    我们可以打印节点的nameattribute_nodes

    doc.xpath("//*[@blubb='blah']").each {|node|
      puts "Node before:\n #{node.name} "+node.attribute_nodes.reduce('') { |out, n| out+="#{n.name}=#{n.value}'"}
      node['blubb'] = "NEW"
      puts "Node after:\n #{node.name} "+node.attribute_nodes.reduce('') { |out, n| out+="#{n.name}='#{n.value}'"}
    }
    

    【讨论】:

    • 我希望有一个更紧凑的解决方案,但这样就可以了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多