2012-03-06 15 views
7

Sto scrivendo un paio di script per modificare i file xml. I file in questione utilizzano l'elemento xml: lang. Groovy (XmlSlurper) sembra stia inserendo uno spazio dei nomi tag0, che non mi dispiacerebbe troppo, tranne che sembra interrompere l'elaborazione successiva con XmlUtil.XML Groovy e lo spazio dei nomi "xml:"

Un esempio:

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) 

risultati in

[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 è suppone l'esistenza di default, e ho provato ad aggiungere con .declareNamespace(), ma doesn' t sembra aiutare. Mi sento come se mi mancasse qualcosa di ovvio, ma Google non è stato in grado di dirmi di cosa si tratta.

risposta

8

Trovato this thread di qualche anno fa, che dice:

Il problema è che il documento originale utilizza lo spazio dei nomi di default.

SMB normalmente non utilizza lo spazio dei nomi predefinito in modo che inventi un tag e lo utilizzi per contrassegnare esplicitamente ciascun elemento nello spazio dei nomi. Per quanto riguarda un parser XML, non importa come viene indicato lo spazio dei nomi. Tuttavia ci sono ragioni estetiche per le quali talvolta è preferibile utilizzare gli spazi dei nomi predefiniti.

Se si inserisce mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee") come prima riga nella chiusura del builder si dovrebbe ottenere l'output desiderato.

Tuttavia, questo non sembra funzionare

L'unica soluzione che ho trovato è quello di rendere lo Slurper ignorare i namespace e di validazione;

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

Purtroppo non è produrre questo effetto per me. Ricevo esattamente lo stesso errore di prima. Sono entusiasta di 1.8.6, e tu? –

+0

Appena controllato di nuovo, e hai ragione ... Scusa ... lo rimuoverò, e ne avrò un'altra a vedere se riesco a risolverlo ... –

+0

@ErikAckerman Aggiornato la mia risposta per mostrare l'unica soluzione I trovato –

2

L'impostazione dello spazio dei nomi predefinito per il tag vuoto funziona per me (non è stato aggiunto "tag0"). utilizzare il costruttore di default XmlSlurper avere namespacing lavorare e convalida, ad esempio:

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

Quando vincolante, dichiara namespace vuoto:

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