2012-02-08 239 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('': '') 

從在默認名稱空間是在「沒有命名空間」命名空間是復位元件固定這一點。

相關問題