我正在尝试使用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', '')
答案 0 :(得分:21)
您可以构建XmlSlurper
而不是namespace awareness,如下所示:
import groovy.xml.XmlUtil
def pom = new XmlSlurper( false, false ).parse( 'pom.xml' )
println XmlUtil.serialize(pom)
哪个应该给你你想要的答案...目前还不知道如何在slurp / serialize循环期间保持评论: - (
正如你所说,有可能使用XmlParser,但我目前的尝试失败了:-( {em> 可能 让你关闭some code here但是到目前为止我还没有成功: - (
答案 1 :(得分:3)
我遇到了同样的问题,“tag0”被添加到没有定义命名空间的元素(即它们位于“no namespace”命名空间中)。我通过添加
来解决这个问题declareNamespace('': '')
将元素从默认命名空间重置为“无命名空间”命名空间。
答案 2 :(得分:1)
我发现如果你正在处理命名空间并且遇到tag0问题,最好使用XmlParser而不是XmlSlurper。在句法上它们看起来是一样的,例如:
def root = new XmlParser().parse(new File('example.xml'))
println XmlUtil.serialize(root)
上面的代码将完全按照包含名称空间的方式输出example.xml。
如果要以某种方式处理根,例如查找特定节点,请使用Groovy API并输出结果,例如
def root = new XmlParser().parse(new File('example.xml')
def result = root."ns:Element"[0]
println XmlUtil.serialize(result)