gpt4 book ai didi

ruby - 使用 Nokogiri 从空标签中递归清理 XML 文档?

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:00 25 4
gpt4 key购买 nike

我有一个嵌套的 XML 文档,如下所示:

<?xml version="1.0"?>
<phone>
<name>test</name>
<descr>description</descr>
<empty/>
<lines>
<line>12345</line>
<css/>
</lines>
</phone>

我需要删除所有空的 XML 节点,例如 <empty/><css/> .

我最终得到了这样的结果:

doc = Nokogiri::XML::DocumentFragment.parse <<-EOXML
<phone>
<name>test</name>
<descr>description</descr>
<empty/>
<lines>
<line>12345</line>
<css/>
</lines>
</phone>
EOXML

phone = doc.css("phone")
phone.children.each do | child |
child.remove if child.inner_text == ''
end

上面的代码只删除了第一个空标签,例如<empty/> .我无法进入嵌套 block 。我想我需要一些递归策略。仔细阅读了Nokogiri的文档,查了很多例子,还没找到解决办法。

我该如何解决这个问题?

我正在使用 Ruby 1.9.3 和 Nokogiri 1.5.10。

最佳答案

有不同做法的后来者,希望能增加额外的见解。这种方法删除了恼人的额外新行,并让您可以选择保留具有已设置值的属性的空字段。

require 'nokogiri'

doc = Nokogiri::XML::Document.parse <<-EOXML
<phone>
<name>test</name>
<descr>description</descr>
<empty/>
<lines>
<line>12345</line>
<css/>
</lines>
</phone>
EOXML

def traverse_and_clean(kid)
kid.children.map { |child| traverse_and_clean(child) }
kid.remove if kid.content.blank?
end

traverse_and_clean(doc)

输出

<?xml version="1.0"?>
<phone>
<name>test</name>
<descr>description</descr>
<lines>
<line>12345</line>
</lines>
</phone>

如果您发现自己处于特殊情况,需要保留一些设置了特定属性的空字段。您所要做的就是稍微更改 traverse_and_clean 方法:

def traverse_and_clean(kid)
kid.children.map { |child| traverse_and_clean(child) }
kid.remove if kid.content.blank? && kid.attributes.blank?
end

关于ruby - 使用 Nokogiri 从空标签中递归清理 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20123176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com