tag0名称空间为默认名称空间中的元素添加

时间:2012-02-08 16:39:08

标签: 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', '')

3 个答案:

答案 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)