如何在 Nokogiri 中找到空的结束标签?

How to find empty closing tags in Nokogiri?

我有几个关于 Ruby 中的 Nokogiri 的问题。

我有一个 Nokogiri XML 文档,其中包含一些空的结束标记。其中一些可以嵌套几层。

例如;

<Authors>
     <Name>A Name</Name>
     <Titles>
          <Title1>A Book</Title1>
          <Title2/>
     </Titles>
     <Reviews>
          <Review1/>
     </Reviews>
 </Authors>
  1. 有谁知道找到这些嵌套空标签的简单方法吗?或者任何人都可以帮助以最简单的方式浏览文档以找到这些元素吗?

  2. 此外,在 <Review> 标签的情况下,当我找到并删除 <Review1/> 时,是否有一种简单的方法来检查是否没有其他兄弟姐妹并将其删除父标签,现在将不包含其他元素?

这是进行递归遍历的好地方。从文档根目录开始,您可以走 children depth-first,边走边清理它们。如果 child 没有内容,请将其删除。

def clean(node)
  node.children.each do |child|
    clean(child)
    child.remove if child.content.gsub(/\s+/, '').empty?
  end
end

您可以通过在删除 child 之前清理它来实现第 (2) 部分的愿望 - 这确保在考虑 <Reviews> 之前找到并删除 <Review1>。如果您不想删除 now-empty parents,您可以交换这些行。

因为您的文档的格式是供人类阅读的,所以很多节点都包含其中带有空格的文本节点,因此 gsub 在考虑是否为空之前将其清除。

根据您的输入,结果为:

<?xml version="1.0"?>
<Authors>
  <Name>A Name</Name>
  <Titles>
    <Title1>A Book</Title1>
  </Titles>
</Authors>