递归地从 XML 中删除空节点

2024-01-04

我想从 XML 元素中删除空节点。 该 xml 是由供应商生成的,我无法控制 xml 的生成。但由于 XML 几乎没有空节点,我需要递归删除这些空节点。

这个 xml 是从 OMElement 获取的,我使用 [XMLUtils][1] 从这个对象获取一个元素 XML 示例

<A>
  <B>
    <C>
      <C1>
        <C11>something</C11>
        <C12>something</C12>
      </C1>
    </C>
    <D>
      <D1>
        <D11>
          <D111 operation="create">
            <Node>something else</Node>
          </D11>
        </D11>
      </D1>
      <D2>
        <D21>

        </D21>
      </D2>
    </D>
  </B>
</A> 

由于D21是一个空节点,我想删除D21,并且由于现在D2是一个空节点,我想删除D2,但由于D有D1,我不想删除D。

同样,我有可能得到

<A>
  <B>
    <C>

    </C>
  </B>
</A>

现在,由于 C 为空,我想删除 C,然后删除 B,最后删除节点 A。 我正在尝试使用removeChild()方法来做到这一点Node http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Node.html

但到目前为止我无法递归地删除它们。 有什么建议可以递归地删除它们吗?

我正在递归地尝试获取节点和节点长度。但节点长度没有帮助

if(childNode.getChildNodes().getLength() == 0 ){
       childNode.getParentNode().removeChild(childNode);

               }

Regards
迪拉吉·乔希


我没有足够的代表来评论 @Adam 的解决方案,但我遇到了一个问题,在删除节点后,该节点的最后一个兄弟节点被移动到索引零,导致它无法完全删除空元素。解决方法是使用一个列表来保存我们想要递归调用删除的所有节点。

此外,还有一个错误删除了具有属性的空元素。

这两个问题的解决方案:

public static void removeEmptyNodes(Node node) {

    NodeList list = node.getChildNodes();
    List<Node> nodesToRecursivelyCall = new LinkedList();

    for (int i = 0; i < list.getLength(); i++) {
        nodesToRecursivelyCall.add(list.item(i));
    }

    for(Node tempNode : nodesToRecursivelyCall) {
        removeEmptyNodes(tempNode);
    }

    boolean emptyElement = node.getNodeType() == Node.ELEMENT_NODE 
          && node.getChildNodes().getLength() == 0;
    boolean emptyText = node.getNodeType() == Node.TEXT_NODE 
          && node.getNodeValue().trim().isEmpty();

    if (emptyElement || emptyText) {
        if(!node.hasAttributes()) {
            node.getParentNode().removeChild(node);
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归地从 XML 中删除空节点 的相关文章

随机推荐

  • 在文档中查找 HTML 字符串

    我想获取所有 HTML p p 在一个文档中 Using Regex使用以下命令查找所有此类字符串 Regex regex new Regex
  • Android Studio“项目结构”未正常显示

    我遵循 Android Studio 安装的所有必要步骤 我也检查过this https stackoverflow com questions 17961397 android studio new project missing fol
  • 在 Dyalog RIDE 中设置条件断点

    In 对话骑行 https github com Dyalog ride 我知道如何设置断点来停止 APL 源代码中特定行的执行 有没有办法使断点有条件 这样只有满足一组特定的条件 我才能在一行处停止 例如0 lt 没有IDE 或RIDE
  • 为什么 iostream 定义了一个 abs 函数,我该如何阻止它?

    以下 C 代码无法编译 int main double a abs 5 1 return 0 它抱怨说abs当然 没有定义 但以下内容确实可以编译 include
  • 如何在保存 Sitecore 项目时显示弹出窗口?

    保存 Sitecore 项目时 我尝试显示一个弹出窗口以与用户交互 根据他们更改的数据 我可能会显示一系列 1 或 2 个弹出窗口 询问他们是否要继续 我已经弄清楚如何利用 OnItemSaving 管道 这很简单 我不知道如何显示弹出窗口
  • 保留提交的JSP表单数据

    我有一个网络表单 JSP 它将数据提交到托管在不同服务器上的不同应用程序 提交表单数据后 该应用程序重定向回同一 JSP 页面 现在 我想保存输入的数据 以网络形式保留提交的数据有哪些不同的方法 我不喜欢将数据存储在数据库或任何文件中 PS
  • 当我在终端中调用 Emacs 错误“无法初始化颜色列表解档器”时

    我刚刚在 MacBook Pro 上安装了 emacs 但是当我在终端中输入 emacs 时 出现以下错误 Emacs x86 64 10 10 5647 247335 无法初始化颜色列表解档器 错误域 NSCocoaErrorDomain
  • AngularJS ui-router $state.go('^') 仅更改地址栏中的 URL,但不加载控制器

    我正在尝试使用 angularjs 创建一个 Todo App ui router 它有 2 列 第一栏 待办事项列表 第 2 列 Todo 详细信息或 Todo 编辑表单 在保存待办事项后的编辑和创建控制器中 我想重新加载列表以显示适当的
  • portaudio.h:没有这样的文件或目录

    我在 ubuntu 16 04 中尝试使用 pip3 安装 pyaudio 时出现以下错误 Collecting pyaudio Downloading PyAudio 0 2 11 tar gz Installing collected
  • python 3.4 谷歌浏览器历史

    我真的被我想做的事情困住了 我想制作一个非常简单的脚本来显示 Google Chrome 的历史记录 当我使用以下代码行时 f open C Users joey AppData Local Google Chrome User Data
  • 使用 ckeditor 整理 html

    您好 我在 ckeditor 方面遇到了一个小问题 基本上我需要让编辑器运行它的 html 清理命令 有什么办法可以做到这一点吗 目前 在我在源代码中输入一些内容然后按保存后 它似乎没有运行我希望它像在 正常 编辑器视图中那样整理 html
  • 给定一个 Android 音乐播放列表名称,如何找到播放列表中的歌曲?

    可以通过查询找到播放列表名称MediaStore Audio Playlists EXTERNAL CONTENT URI然后看看MediaStore Audio PlaylistsColumns NAME柱子 还有一个数据列 MediaS
  • REST Auth 的 Cocoa Base 64 实现

    我可以使用干净 有效的 Base64 实现来通过 HTTP 对 REST 协议进行授权 有人可以帮助我或为我指明方向吗 Thanks 您应该完全没有必要这样做 在较高的层面上 Cocoa 提供了 NSURLConnection 来进行 HT
  • 使用 dlsym 加载已命名的未导出符号?

    是否可以使用以下方式从框架加载命名的未导出符号dlsym 我尝试导入的符号有一个在框架内引用的名称 这是我需要调用的函数 我试着像往常一样做dlopen dlsym方式 但是当我尝试加载未导出的符号时 dlsym返回一个NULL指针 dls
  • 蓝兹编程

    我正在使用 USB 蓝牙适配器在 Raspberry Pi 上使用 BlueZ 进行编程 我需要能够以编程方式连接到 Arduino BT 问题是 Arduino 的蓝牙模块仍在使用传统配对 因此每当我尝试打开设备的套接字时 我都会收到Pe
  • 如何在Python中计算mod b?

    Python中有取模函数吗math图书馆 Isn t 15 4 3 但15 mod 4是1 对吗 有的是 符号 它不仅仅是求余数 而是求模运算
  • 尽管提供了 Twitter Api,回调 URL 仍未获得批准

    在 Twitter 控制台中 我有一个来自 firebase 的回调 url 链接 然而 当我尝试使用 twitter 进行身份验证时 出现错误 Request failed forbidden 403 UserInfo NSLocaliz
  • Gradle eclipse classpath - 在快照和项目依赖之间切换

    我们的 Java 项目中有多个模块 每个模块都会将 SNAPSHOT jar 文件发布到 Nexus 存储库 所有子模块都直接依赖于 SNAPSHOT jar 文件 在开发过程中 我们希望依赖 Eclipse 项目而不是 SNAPSHOT
  • boost::flat_map 及其与 map 和 unordered_map 相比的性能

    编程中的常识是 由于缓存命中 内存局部性可以大大提高性能 我最近发现boost flat map这是基于矢量的地图实现 它似乎并不像典型的那样受欢迎map unordered map所以我没能找到任何性能比较 它的比较如何 它的最佳用例是什
  • 递归地从 XML 中删除空节点

    我想从 XML 元素中删除空节点 该 xml 是由供应商生成的 我无法控制 xml 的生成 但由于 XML 几乎没有空节点 我需要递归删除这些空节点 这个 xml 是从 OMElement 获取的 我使用 XMLUtils 1 从这个对象获