2012-02-08 181 views
10

我想使用Groovy的XmlSlurper解析和修改Maven的pom.xml。我的pom.xml声明了命名空间xsi。为默认名称空间中的元素添加tag0名称空间

<?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', '') 
+1

正在构建'XmlSlurper'没有名称空间支持godd够了吗?即:'println XmlUtil.serialize(new XmlSlurper(false,false).parse('pom.xml'))'? – 2012-02-09 14:14:39

+0

哇,是的,这已经够了,谢谢蒂姆。你能把它作为答案吗?另外我注意到,XML中的所有注释都丢失了,您是否知道它的任何解决方法?顺便说一下,这里是我写的两个工具[pomRm](http://www.stefanolocati.it/blog/?p=1226)和[pomVersions](http://www.stefanolocati.it/blog/?p= 1220)。 – stivlo 2012-02-09 14:51:08

+0

目前无法看到如何保留评论... :-(如果我今天下午得到空闲时刻,我会想一想... – 2012-02-09 15:15:39

回答

16

您可以为没有namespace awareness像这样构建XmlSlurper

import groovy.xml.XmlUtil 

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

这应该给你你想要的答案.. 。目前还不知道如何在slurp/serialize周期中维护注释:-(

正如你所说,它可能与XmlParser的,但我目前的尝试都失败了:-(有some code here可能让你关闭,但至今我没有成功:-(

+0

谢谢蒂姆,这个作品,我会在周末尝试的评论问题。 – stivlo 2012-02-10 05:33:10

+0

CommentCollectingParser用于在节点之前查找注释,例如打印评论:* def parser = new CommentCollectingParser(); def root = parser.parse(new File('plan.xml')); println parser.commentsFor(root.week [0]); *但是,如果我尝试打印整个XML,它们不包括在内。 * def writer = new StringWriter();新的XmlNodePrinter(新的PrintWriter(writer))。print(root); println writer.toString(); *在[XmlParser JavaDoc](http://groovy.codehaus.org/api/groovy/util/XmlParser.html)中,实际上他们会说:*此解析器忽略注释和处理指令* – stivlo 2012-02-11 18:17:52

+0

它也适合我。 – Pushkar 2014-12-04 13:50:48

1

我发现它是更好地使用XmlParser的,而不是XmlSlurper如果你正在处理命名空间并且有tag0问题。在语法上,他们似乎是相同的,如:

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) 
3

我有同样的问题与“TAG0”被添加到该没有定义名称空间的元素(即它们在“无名称空间”名称空间中)。我通过添加

declareNamespace('': '') 

从在默认名称空间是在“没有命名空间”命名空间是复位元件固定这一点。

相关问题