Nokogiri:non-destructively 打印没有其 children 的节点

Nokogiri: non-destructively print node without its children

我有一段 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 的开始标记,或者至少只显示没有 child 节点的元素本身?重要的是节点本身在打印时不会改变(除了属性中的替换),所以删除 children 不是一个选项!

我们可以打印节点的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}'"}
}