2012-03-06 22 views
7

Piszę kilka skryptów modyfikujących pliki xml. Pliki, o których mowa, używają elementu xml: lang. Groovy (XmlSlurper) wydaje się wstawiać przestrzeń nazw tag0, której nie miałbym nic przeciwko, z wyjątkiem, że wydaje się, że przerwie to później przetwarzanie za pomocą XmlUtil.Groovy XML i przestrzeń nazw "xml:"

Przykład:

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) 

skutkuje

[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 ma istnieć domyślnie i próbowałem dodanie go z .declareNamespace(), ale nie robi” wydaje się pomagać. Czuję, że brakuje mi czegoś oczywistego, ale Google nie był w stanie powiedzieć mi, co to jest.

Odpowiedz

8

Znaleziony this thread od kilku lat temu, który mówi:

Problem polega na tym, że oryginalny dokument używa domyślnej przestrzeni nazw.

SMB zwykle nie używa domyślnej przestrzeni nazw, więc wymyśla tag i używa go do jawnego oznaczania każdego elementu w przestrzeni nazw. W przypadku parsera XML nie ma znaczenia, w jaki sposób wskazana jest przestrzeń nazw. Istnieją jednak kosmetyczne powody, dla których czasami pożądane jest używanie domyślnych przestrzeni nazw.

Jeśli umieścisz mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee") jako pierwszą linię w zamknięciu programu budującego, powinieneś uzyskać żądane wyjście.

Jednak to nie wydają się działać

Jedynym rozwiązaniem znalazłem jest, aby Slurper ignorować nazw i walidacji;

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

Niestety to nie wywierać taki wpływ na mnie. Otrzymuję dokładnie ten sam błąd, co poprzednio. Jestem w świetnym 1.8.6, a ty? –

+0

Po prostu sprawdziłem ponownie i masz rację ... Przepraszam ... usunę to i jeszcze raz zobaczę, czy mogę to rozwiązać ... –

+0

@ErikAckerman Zaktualizowałem moją odpowiedź, aby pokazać jedyne rozwiązanie znalazłem –

2

Ustawienie domyślnego obszaru nazw dla pustego tagu działa dla mnie (nie dodano "tag0"). używam domyślnego konstruktora XmlSlurper mieć przestrzenie nazw roboczą i walidacji, np

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

Kiedy wiążące oświadczyć pustą przestrzeń nazw:

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