2012-02-08 30 views
10

Sto cercando di analizzare e modificare un pom.xml di Maven utilizzando XmlSlurper di Groovy. Il mio pom.xml dichiara lo spazio dei nomi xsi.spazio dei nomi tag0 aggiunto per gli elementi nello spazio dei nomi predefinito

<?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> 

La mia fonte Groovy è la seguente:

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) 

Come si nota, ho dichiarato il primo spazio dei nomi come vuoto. Tuttavia nel tag di output0 viene aggiunto ovunque.

<?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> 

Come evitare quello?

Per il momento la mia soluzione è rimuovere i tag manualmente:

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

La costruzione di 'XmlSlurper' senza supporto spazio dei nomi è sufficiente? es .: 'println XmlUtil.serialize (new XmlSlurper (false, false) .parse ('pom.xml'))'? –

+0

wow, sì, era già abbastanza, grazie Tim. puoi fornirlo come risposta? Inoltre ho notato che tutti i commenti in XML sono persi, sai qualche soluzione per questo? A proposito, ecco le due utility che ho scritto [pomRm] (http://www.stefanolocati.it/blog/?p=1226) e [pomVersions] (http://www.stefanolocati.it/blog/?p= 1220). – stivlo

+0

Non riesco a vedere come mantenere i commenti al momento ... Triste Avrò un pensiero se ottengo un momento libero questo pomeriggio ... –

risposta

16

è possibile costruire il XmlSlurper senza namespace awareness in questo modo:

import groovy.xml.XmlUtil 

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

che dovrebbe dare la risposta che vuoi .. Nessuna idea attualmente su come mantenere i commenti durante il ciclo slurp/serialize :-(

Come dici tu, potrebbe essere possibile con XmlParser, ma i miei attuali tentativi sono falliti :-(C'è some code here che potrebbe ottenere si chiude, ma finora non ho avuto alcun successo :-(

+0

Grazie, Tim, funziona, per il problema dei commenti che proverò nel weekend. – stivlo

+0

CommentCollectingParser lavora per trovare i commenti che precedono un nodo, quindi, ad esempio, per stampare un commento: * def parser = new CommentCollectingParser(); def root = parser.parse (new File ('plan.xml')); println parser.commentsFor (root.week [0]); * Tuttavia, se provo a stampare l'intero XML, non sono inclusi. * def writer = new StringWriter(); nuovo XmlNodePrinter (nuovo PrintWriter (writer)). print (root); println writer.toString(); * In [XmlParser JavaDoc] (http://groovy.codehaus.org/api/groovy/util/XmlParser.html), infatti, dicono: * Questo parser ignora i commenti e le istruzioni di elaborazione * – stivlo

+0

Funziona anche per me. – Pushkar

1

ho scoperto che è meglio usare XmlParser piuttosto che XmlSlurper se hai a che fare con spazi dei nomi e con il problema di tag0. Sintatticamente sembrano lo stesso, ad esempio:

def root = new XmlParser().parse(new File('example.xml')) 
println XmlUtil.serialize(root) 

Il codice di cui sopra sarebbe uscita l'example.xml esattamente come dovrebbe essere compresa spazi dei nomi.

Se si desidera elaborare la radice in qualche modo, ad esempio, trovare un nodo specifico, utilizzare l'API Groovy e in uscita il risultato, ad esempio

def root = new XmlParser().parse(new File('example.xml') 
def result = root."ns:Element"[0] 
println XmlUtil.serialize(result) 
3

ho avuto lo stesso problema con "tag0" ottenendo aggiunto elementi che non hanno definito uno spazio dei nomi (cioè erano nello spazio dei nomi "nessun spazio dei nomi"). Ho fissato questo aggiungendo

declareNamespace('': '') 

che resetta elementi dall'essere nello spazio predefinito per essere nello spazio "namespace".

Problemi correlati