Nokogiri: неразрушающая печать узла без его дочерних элементов - PullRequest
0 голосов
/ 06 августа 2020

У меня есть фрагмент 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 или хотя бы только сам элемент без его дочерних узлов? Важно то, что сам узел не изменяется при печати (кроме замены в атрибуте), поэтому удаление дочерних узлов не вариант!

1 Ответ

1 голос
/ 06 августа 2020

Мы можем напечатать name и attribute_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}'"}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...