2012-02-08 26 views
10

Estoy tratando de analizar y modificar un pom.xml de Maven usando XmlSlurper de Groovy. Mi pom.xml declara el espacio de nombres xsi.espacio de nombre tag0 agregado para los elementos en el espacio de nombres predeterminado

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

Mi fuente maravillosa es la siguiente:

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) 

Como se nota, he declarado el primer espacio de nombres como vacío. Sin embargo, en la etiqueta de salida0 se agrega en todas partes.

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

¿Cómo evitar eso?

Para el momento en que mi solución es la eliminación de las etiquetas de forma manual:

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

Está construyendo 'XmlSlurper' sin espacio de nombres suficiente para godd? es decir: 'println XmlUtil.serialize (nuevo XmlSlurper (falso, falso) .parse ('pom.xml'))'? –

+0

guau, sí, eso ya fue suficiente, gracias Tim. ¿Puedes proporcionarlo como una respuesta? También me he dado cuenta de que se han perdido todos los comentarios en XML, ¿conoce alguna solución para ello? Por cierto, aquí están las dos utilidades que escribí [pomRm] (http://www.stefanolocati.it/blog/?p=1226) y [pomVersions] (http://www.stefanolocati.it/blog/?p= 1220). – stivlo

+0

No puedo ver cómo mantener los comentarios en este momento ... :-(Voy a pensar que si tengo un momento libre esta tarde ... –

Respuesta

16

Usted puede construir el XmlSlurper sin namespace awareness así:

import groovy.xml.XmlUtil 

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

que debe dar la respuesta que desea .. No tengo idea de cómo mantener los comentarios durante el ciclo slurp/serialize :-(

Como dices, podría ser posible con XMLParser, pero mis intentos actuales han fracasado :-(Hay some code here cuales podría conseguir cerrar, pero hasta ahora no he tenido ningún éxito :-(

+0

Gracias Tim, esto funciona, por la cuestión de comentarios que intentaré en el fin de semana. – stivlo

+0

CommentCollectingParser funciona para encontrar los comentarios que preceden a un nodo, por ejemplo, para imprimir un comentario: * def parser = new CommentCollectingParser(); def root = parser.parse (nuevo archivo ('plan.xml')); println parser.commentsFor (root.week [0]); * Sin embargo, si intento imprimir todo el XML, no están incluidos. * def writer = new StringWriter(); nuevo XmlNodePrinter (nuevo PrintWriter (escritor)). print (root); println writer.toString(); * En [XmlParser JavaDoc] (http://groovy.codehaus.org/api/groovy/util/XmlParser.html), de hecho dicen: * Este analizador ignora los comentarios y las instrucciones de procesamiento * – stivlo

+0

Su trabajo para mí también. – Pushkar

1

he encontrado que es mejor usar en lugar de XMLParser XmlSlurper si se trata de espacios de nombres y tiene el problema tag0. Sintácticamente que parecen el mismo, por ejemplo:

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

El código anterior emitiría lo example.xml exactamente como debe ser incluido espacios de nombres.

Si desea procesar la raíz de alguna manera, por ejemplo, encontrar un nodo específico, utilice la API de Groovy y enviar el resultado, por ejemplo

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

que tenía el mismo problema con "TAG0" van añadiendo a elementos que no definían un espacio de nombres (es decir, estaban en el espacio de nombres "sin espacio de nombres"). He arreglado esto añadiendo

declareNamespace('': '') 

que restablece los elementos de estar en el espacio de nombres por defecto a estar en el espacio de nombres "ningún espacio de nombres".

Cuestiones relacionadas