xml - vinculado - qué es un namespace y para qué se utiliza
espacio de nombres tag0 agregado para los elementos en el espacio de nombres predeterminado (3)
Puede construir XmlSlurper
sin conocimiento del espacio de nombres de esta manera:
import groovy.xml.XmlUtil
def pom = new XmlSlurper( false, false ).parse( ''pom.xml'' )
println XmlUtil.serialize(pom)
Que debería darle 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 fallado :-( Aquí hay un código que podría acercarte, pero aún no he tenido éxito :-(
Estoy tratando de analizar y modificar un pom.xml de Maven usando XmlSlurper de Groovy. Mi pom.xml declara el espacio de nombres 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>
Mi fuente Groovy 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 nota, he declarado que el primer espacio de nombres está 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?
Por el momento, mi solución es eliminar las etiquetas de forma manual:
println XmlUtil.serialize(pom).replaceAll(''tag0:'', '''').replaceAll('':tag0'', '''')
Descubrí que es mejor usar XmlParser en lugar de XmlSlurper si se trata de espacios de nombres y tiene el problema tag0. Sintácticamente parecen iguales, por ejemplo:
def root = new XmlParser().parse(new File(''example.xml''))
println XmlUtil.serialize(root)
El código anterior generará el example.xml exactamente como debe ser, incluidos los espacios de nombres.
Si desea procesar la raíz de alguna manera, por ejemplo, busque un nodo específico, use la API de Groovy y envíe el resultado, por ej.
def root = new XmlParser().parse(new File(''example.xml'')
def result = root."ns:Element"[0]
println XmlUtil.serialize(result)
Tuve el mismo problema con la adición de "tag0" a los elementos que no definían un espacio de nombres (es decir, estaban en el espacio de nombres "sin espacio de nombres"). Lo arreglé añadiendo
declareNamespace('''': '''')
que restablece los elementos de estar en el espacio de nombre predeterminado a estar en el espacio de nombres "sin espacio de nombres".