2012-03-06 30 views
7

Estoy escribiendo un par de scripts para modificar los archivos xml. Los archivos en cuestión usan el elemento xml: lang. Groovy (XmlSlurper) parece estar insertando un espacio de nombre tag0, que no me importaría demasiado, excepto que parece romper el procesamiento posterior con XmlUtil.Groovy XML y el espacio de nombres "xml:"

Un ejemplo:

import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 

String source = """<?xml version='1.0' encoding='UTF-8'?> 
<root> 
    <one xml:lang="en">First</one> 
    <one xml:lang="de">Second</one> 
</root> 
""" 

def root = new XmlSlurper().parseText(source).declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 
println root 
String xml = new StreamingMarkupBuilder().bind{ 
    mkp.xmlDeclaration() 
    out << root 
} 
println xml 
println XmlUtil.serialize(xml) 

resultados en

[Fatal Error] :2:44: The value of the attribute "prefix="xmlns",localpart="tag0",rawname="xmlns:tag0"" is invalid. Prefixed namespace bindings may not be empty. 

xml: namespace se supone que existe por defecto, y he probado con la adición de .declareNamespace() pero doesn' parece ayudar Siento que me falta algo obvio, pero Google no ha podido decirme qué es.

Respuesta

8

encontrado this thread de hace unos años, que dice:

El problema es que el documento original utiliza el espacio de nombres predeterminado.

SMB no utiliza normalmente el espacio de nombres predeterminado, por lo que inventa una etiqueta y la utiliza para marcar explícitamente cada elemento en el espacio de nombres. En lo que respecta a un analizador XML, no importa cómo se indique el espacio de nombres. Sin embargo, hay razones estéticas por las que a veces es deseable usar espacios de nombres predeterminados.

Si pone mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee") como la primera línea en el cierre de su constructor, debe obtener la salida que desea.

Sin embargo, esto no parece funcionar

La única solución que he encontrado es hacer caso omiso de la Slurper espacios de nombres y validación;

def root = new XmlSlurper(false,false).parseText(source) 
+0

Desafortunadamente no es tener tal efecto para mí. Obtengo el mismo error exacto que antes. Estoy en Groovy 1.8.6, ¿y tú? –

+0

Acabo de volver a verificar, y tiene razón ... Lo siento ... Eliminaré esto, y volveré a intentarlo si puedo resolverlo ... –

+0

@ErikAckerman Actualicé mi respuesta para mostrar la única solución que he encontrado –

2

Configurar el espacio de nombre predeterminado para vaciar etiqueta funciona para mí (no se ha agregado "tag0"). que utilizar el constructor por defecto XmlSlurper tener espacios de nombre del trabajo y de la validación, por ejemplo:

def root = new XmlSlurper().parseText(source).declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 

Cuando vinculante, declaran espacio de nombres vacío:

def writer = new StreamingMarkupBuilder().bind { 
    mkp.declareNamespace("": "") //get rid of "tag0" 
    mkp.declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 
    mkp.yield root 
} 
Cuestiones relacionadas