2009-08-04 4 views
0

Ich habe so etwas als Eingang:Java + DOM: Wie kann ich ein xmlns: xyz-Attribut elegant umbenennen?

<root xmlns="urn:my:main" 
    xmlns:a="urn:my:a" xmlns:b="urn:my:b"> 

    ... 
</root> 

Und will so etwas als Ausgabe haben:

<MY_main:root xmlns:MY_main="urn:my:main" 
    xmlns:MY_a="urn:my:a" xmlns:MY_b="urn:my:b"> 

    ... 
</MY_main:root> 

... oder umgekehrt.

Wie erreiche ich dies auf elegante Weise mit DOM?
Das heißt, ohne nach Attributnamen zu suchen, die mit "xmlns" beginnen.

Antwort

1

Sie werden die xmlns-Attribute nicht in Ihrem DOM finden, sie sind nicht Teil des DOM.

Sie können erfolgreich sein, wenn Sie die gewünschten Knoten (getElementsByTagNameNS) finden und ihren qualifiziertenName (qname) auf einen neuen Wert setzen, der das gewünschte Präfix enthält. Dann generieren Sie das XML-Dokument neu.

Übrigens, das Namespace-Präfix (das ist was Sie versuchen zu ändern) ist weitgehend irrelevant, wenn Sie einen vernünftigen XML-Parser verwenden. Der Namespace-URI zählt. Warum sollten Sie das Präfix auf einen bestimmten Wert setzen?

+0

Weil ich vom Benutzer lesbare XML (in der Regel ein Oxymoron) in einem besonderen Fall benötigen. Danke für die Antwort! –

0

ich folgende jdom Stub verwendet haben alle Referenzen, die Namespace zu entfernen:

Element rootElement = new SAXBuilder().build(contents).getRootElement(); 

for (Iterator i = rootElement.getDescendants(new ElementFilter()); i.hasNext();) { 
    Element el = (Element) i.next(); 
    if (el.getNamespace() != null) el.setNamespace(null); 
} 

return rootElement; 

Lesen und das Schreiben von XML als normal durchgeführt. Wenn Sie gerade nach einer menschenlesbaren Ausgabe sind, sollten Sie diese Aufgabe erledigen. Wenn Sie jedoch zurück konvertieren müssen, haben Sie möglicherweise ein Problem.

können die folgenden Arbeiten die Namensräume mit einer freundlicheren Version basierend auf dem Beispiel (ungetestet) ersetzen:

rootElement.setNamespace(Namespace.getNamespace("MY_Main", "urn:my:main")); 
rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_a", "urn:my:a")) 
rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_b", "urn:my:b")) 
Verwandte Themen