更改 XML 标签名称

2024-02-20

我想转换一个我已经解析过的 XML 文档XmlSlurper。 (相同的)XML 标记名称应替换为id属性;所有其他属性都应该被删除。从这段代码开始:

def xml = """<tag id="root">
            |  <tag id="foo" other="blah" more="meh">
            |    <tag id="bar" other="huh"/>
            |  </tag>
            |</tag>""".stripMargin()

def root = new XmlSlurper().parseText(xml)

// Some magic here.

println groovy.xml.XmlUtil.serialize(root)

我想得到以下内容:

<root>
  <foo>
    <bar/>
  </foo>
</root>

(我在 XML 上编写测试断言,并希望简化它们的结构。)我已阅读使用 XmlSlurper 更新 XML http://groovy.codehaus.org/Updating+XML+with+XmlSlurper并四处搜寻,但找不到办法replaceNode() or replaceBody()交换节点同时保留其子节点。


将“魔法”添加到问题中的代码中给出:

def xml = """<tag id="root">
            |  <tag id="foo" other="blah" more="meh">
            |    <tag id="bar" other="huh"/>
            |  </tag>
            |</tag>""".stripMargin()

def root = new XmlSlurper().parseText(xml)

root.breadthFirst().each { n ->
  n.replaceNode { 
    "${n.@id}"( n.children() )
  }
}

println groovy.xml.XmlUtil.serialize(root)

哪个打印:

<?xml version="1.0" encoding="UTF-8"?><root>
  <foo>
    <bar/>
  </foo>
</root>

但是,这将删除节点中的所有内容。为了维护内容,我们可能需要使用递归和 XmlParser 从现有文档生成新文档......我会考虑一下

更通用的解决方案

我认为这更普遍:

import groovy.xml.*

def xml = """<tag id="root">
            |  <tag id="foo" other="blah" more="meh">
            |    <tag id="bar" other="huh">
            |      something
            |    </tag>
            |    <tag id="bar" other="huh">
            |      something else
            |    </tag>
            |    <noid>woo</noid>
            |  </tag>
            |</tag>""".stripMargin()

def root = new XmlParser().parseText( xml )

def munge( builder, node ) {
  if( node instanceof Node && node.children() ) {
    builder."${node.@id ?: node.name()}" {
      node.children().each {
        munge( builder, it )
      }
    }
  }
  else {
    if( node instanceof Node ) {
      "${node.@id ?: node.name()}"()
    }
    else {
      builder.mkp.yield node
    }
  }
}

def w = new StringWriter()
def builder = new MarkupBuilder( w )
munge( builder, root )

println XmlUtil.serialize( w.toString() )

并打印:

<?xml version="1.0" encoding="UTF-8"?><root>
  <foo>
    <bar>something</bar>
    <bar>something else</bar>
    <noid>woo</noid>
  </foo>
</root>

现在穿过没有(或空)的节点id属性

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

更改 XML 标签名称 的相关文章

随机推荐

  • docker run“--env-file”提供的文件未按预期评估的解决方法

    我当前运行 docker 容器的设置如下 我有一个main env file Main export PRIVATE IP echo localhost export MONGODB HOST PRIVATE IP export MONGO
  • Laravel API,如何正确处理错误

    任何人都知道 Laravel 中处理错误的最佳方法是什么 有什么规则或需要遵循吗 目前我正在这样做 public function store Request request plate Plate create request gt al
  • 如何安装 json gem - 无法构建 gem 本机扩展

    我正在尝试将 Rails 应用程序部署到我的 ubuntu Linux 服务器 我正在使用 capistrano 和捆绑器 当安装 gems 时 它失败并出现以下错误 Installing json 1 7 7 with native ex
  • java计算句子中每个单词的频率

    我正在编写一个非常基本的java程序 它计算句子中每个单词的频率 到目前为止我已经做到了这么多 import java io class Linked public static void main String args throws I
  • MySQL的行数count(*)与information_schema中的table.table_rows不一致

    我遇到了一个奇怪的现象 我希望有人可以向我解释一下 我有一些 静态 表格 它们每天更改一次 mysql gt select appObjectGroups as tbl count as num from appObjectGroups u
  • 数据库丢失!寻找根本原因

    假设有一天 管理员像往常一样来到办公室 在 Sql Server 数据库上执行管理任务 他惊讶地发现数据库丢失了 他不知道是谁删除了它 或者是来自外部批处理或 SQL 注入等 从哪里开始调查 以及应该采取哪些重要参数 发现来找到删除数据库的
  • OpenCPU 上的自定义 R 包/找到包,但没有可见的函数

    CI 为 OpenCPU 编写了一个 R 包 并希望在我自己的云服务器上使用它 即使包本身被识别并且可以更新 我也无法访问任何功能 并且我可以通常通过 POST 和 GET 访问其他 非自定义 例如基本或统计 包 我已经安装了自定义包以及所
  • 根据两个属性值的组合选择唯一节点

    我有一些 XML 看起来像这样
  • 当公式更改单元格值时触发脚本

    我正在使用 Google 脚本 然后在 Google 工作表中的特定列发生更改时发送电子邮件 单元格中的信息可以手动输入 也可以根据其他单元格中的信息使用公式完成 当手动输入信息时 脚本可以正常工作 但在公式运行时则不行 我已经阅读了它并意
  • 为什么我无法从其他节点 IP 访问 kubernetes pod?

    我已经在 Kubespray 的帮助下安装了 kubernetes 集群 集群有 3 个节点 2 个主节点和 1 个工作节点 节点1 10 1 10 110 节点2 10 1 10 111 节点3 10 1 10 112 kubectl g
  • 如何在 NancyFX 中写入流输出?

    我正在使用 Nancy 编写一个简单的 Web 应用程序 至少一个请求会导致长度未知的流 因此我无法提供Content Length 我想用Transfer Encoding chunked 或 在这种情况下同样可以接受 Connectio
  • 在 Ruby 中迭代无限序列

    我正在尝试解决 Project Euler 问题 12 三角形数序列是通过将自然数相加生成的 数字 所以第 7 个三角形数 将为 1 2 3 4 5 6 7 28 前十项是 1 3 6 10 15 21 28 36 45 55 让我们列出前
  • PHP XML/HTML DOM 获取带有空格的 CSS 类属性

    我有以下问题 我正在使用 PHP XML DOM 解析器 当我解析现实世界的 HTML 时 许多元素的 class 属性中都有空格 因此这些元素实际上有多个 CSS 类 但是 当我使用 getAttribute 查询 DOMNode 时 我
  • 如何使用 REGEXP_SUBSTR 解析数据?

    我有一个像这样的数据集 见下文 我尝试提取形式为 variable number of digits hyphen only one digit 的数字 with mcte as select ILLD ELKJS 00000000 ELK
  • Composer 软件包已更新但未安装

    做完之后 sudo php composer phar update 我得到以下信息 Loading composer repositories with package information Updating dependencies
  • 通过Java获取Windows文件关联

    我以为这会是一件容易的事 但是 我希望我的 Java 程序能够获取用户的 Windows 文件关联 换句话说 我想知道用户使用什么来打开 txt文件 cvs文件等 assoc 和 ftype 命令提供该信息 但不提供给用户 换句话说 如果我
  • stderr 上的 Paramiko recv()/read()/readline(s)() 返回空字符串

    我正在使用 paramiko 收集远程主机上的一些信息并在阅读时遇到问题 read readline readlines 来自stderr渠道 有时stderr read 返回一个空字符串 在我看来 它看起来像是竞争条件的结果 然而 根据我
  • 计算每列或行非零元素平均值的有效方法

    我有一个 numpy 数组 用于存储用户对电影的评分 评分介于 1 到 5 之间 0 表示用户没有对电影进行评分 我想计算每部电影的平均评分 以及每个用户的平均评分 换句话说 我将计算每列或每行非零元素的平均值 是否有一个有效的 numpy
  • 如果已经登录,则正确跳过登录活动

    我的启动器图标当前启动登录活动 我已将登录状态存储在 SharedPreferences 中 有什么办法可以properly跳过登录活动并直接进入主要活动 无需any用户界面故障 所有现有的解决方案涉及finish in onCreate
  • 更改 XML 标签名称

    我想转换一个我已经解析过的 XML 文档XmlSlurper 相同的 XML 标记名称应替换为id属性 所有其他属性都应该被删除 从这段代码开始 def xml