xml - 为默认命名空间中的元素添加了 tag0 命名空间

标签 xml parsing groovy xmlslurper

我正在尝试使用 Groovy 的 XmlSlurper 解析和修改 Maven 的 pom.xml。我的 pom.xml 声明了命名空间 xsi。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
     http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>a-group-id</groupId>
<artifactId>an-artifact-id</artifactId>

我的 Groovy 源代码如下:

import groovy.xml.XmlUtil
def pom = new XmlSlurper().parse('pom.xml')
   .declareNamespace('': 'http://maven.apache.org/POM/4.0.0',
      xsi: 'http://www.w3.org/2001/XMLSchema-instance')
//manipulate the pom
println XmlUtil.serialize(pom)

如您所见,我已将第一个命名空间声明为空。但是在输出中到处都添加了 tag0。

<?xml version="1.0" encoding="UTF-8"?>
<tag0:project xmlns:tag0="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
      http://maven.apache.org/maven-v4_0_0.xsd">
<tag0:modelVersion>4.0.0</tag0:modelVersion>
<tag0:groupId>a-group-id</tag0:groupId>
<tag0:artifactId>an-artifact-id</tag0:artifactId>

如何避免这种情况?

目前我的解决方法是手动删除标签:

println XmlUtil.serialize(pom).replaceAll('tag0:', '').replaceAll(':tag0', '')

最佳答案

您可以构造没有 namespace awarenessXmlSlurper像这样:

import groovy.xml.XmlUtil

def pom = new XmlSlurper( false, false ).parse( 'pom.xml' )
println XmlUtil.serialize(pom)

哪个应该给你你想要的答案......目前不知道如何在 slurp/serialize 周期中维护评论:-(

如您所说,使用 XmlParser 可能可行,但我目前的尝试失败了 :-( 有 some code here可能 让您接近,但到目前为止我没有成功:-(

关于xml - 为默认命名空间中的元素添加了 tag0 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197588/

相关文章:

php - 识别由 PHP 中的 XSD 定义的允许的 XML 元素

c - C 中的递归下降解析器 - 回溯时出错

parsing - 使用 pest 时如何修复枚举缺失的文档?

grails - 在Grails中解析多部分

grails - 如何从grails中的 Controller 操作中搜索驱动器中的文件夹?

java - `ClassCastException` when case object with `ScriptEngine`

java - Jackson:忽略空@XmlWrapperElement 集合中的空格

java - XStream 在简单的 xml 上失​​败

c# - 在 C# 中写入 XML 时阻止 CDATA 标记被输出转义

java - ANTLR 提供这些功能吗?