Steuern von Namespacepräfixen in JAXB

8

Wie ermittelt jaxb die Liste der Namespace-Präfix-Deklarationen, wenn ein Objekt gerastert wird? Ich habe xjc verwendet, um Java-Klassen für Ebics zu kompilieren ( Ebics-Schema ). Wenn ich eine Instanz für ein ebicsRequest erstelle, sieht das so aus:

%Vor%

Ich habe eine benutzerdefinierte NamespacePrefixMapper verwendet, um den Standard-Namespace und Präfixe für ds und xsi zu deklarieren. Für den Namensraum ds funktioniert es gut. Aber für den Standard-Namespace nicht. Es wird zweimal als ns2 und einmal als "" deklariert. Letzteres kommt von meiner benutzerdefinierten NamespacePrefixMapper.getPreDeclaredNamespaceUris . Ich habe viel mit dieser Klasse gespielt. Ich habe auch versucht, package-info.java zu verwenden, aber ich konnte jaxb nicht "http://www.ebics.org/H003" als Standard-Namespace verwenden. Was ich auch nicht verstehe, ist das Aussehen von ns4 und ns5, die überhaupt nicht Teil des xml-Dokuments sind.

Meine NamespacePrefixMapper-Klasse sieht wie

aus %Vor%

Ich verwende

%Vor%     
Wilberforce 02.02.2011, 10:42
quelle

5 Antworten

8

JAXB fügt dem Stammelement des XML-Dokuments aus Leistungsgründen immer alle Namespaces hinzu, die dem JAXBContext bekannt sind. Siehe diesen Kommentar von Kohsuke auf JAXB-103 für weitere Informationen.

Der einzige Weg, den ich gefunden habe, ist, das Dokument selbst zu durchlaufen, nachdem es mit JAXB erstellt wurde, und alle nicht verwendeten Namespaces mit der folgenden Hilfsklasse zu entfernen:

%Vor%     
Reboot 31.01.2012 21:16
quelle
1

EclipseLink JAXB (MOXy) verwendet die Präfixe wie in der @ XmlSchema Annotation angegeben (ich bin der MOXy führen). Sehen Sie sich meine Antwort auf eine ähnliche Frage als Beispiel an:

Blaise Doughan 02.02.2011 14:28
quelle
1

Ich habe meine JAXB-Klassen mit xjc generiert, aber der von mir verwendete SOAP-WebService zwingt mich, einige Regeln zu befolgen, wie etwa die Verwendung des Namespacepräfixes.

Dies ist ungültig:

%Vor%

Dies ist gültig:

%Vor%

Wie bereits erwähnt, hat JAXB die Namespace-Deklaration auf das Wurzelelement gesetzt.

Um dies zu vermeiden, besteht der erste Ansatz darin, unnötige Elemente im Kontext zu vermeiden.

Beispiel: Setzen Sie den Kontext des Marshallers wie folgt:

%Vor%

Kann JAXB dazu bringen, einige unnötige Deklarationen von Namespaces vorzunehmen.

Manchmal kann ich mich von einem nervigen xmlns="http://www.w3.org/2000/09/xmldsig#" befreien, indem ich einfach den Kontext mit dem notwendigen Root-Element setze:

%Vor%

Ein zweiter Ansatz, den ich nutze, wenn der erste nicht ausreicht, ist, dass der gesamte Kontext denselben Namensraum verwendet. Ändern Sie einfach die unerwünschten " Ссылка " in jeder Namespace-Deklaration (wie @XmlElement oder @XSchema) in die eindeutiger Namespace erlaubt ( Ссылка )

Dann erstelle ich einfach ein Attribut am gewünschten Kind:

%Vor%

Jetzt habe ich die Namespace Deklaration aus der Wurzel, im richtigen Element, ohne irgendein Präfix zu benutzen.

    
Gauss 23.03.2017 22:53
quelle
0

Wie ich festgestellt habe, dass JAXB das Präfix ns2 entfernen soll, muss das folgende Attribut in das Element xs: schema eingefügt werden: elementFormDefault="qualified". So würde es ungefähr so ​​aussehen:

%Vor%     
MeplatMasher 27.07.2012 17:10
quelle
0

Nach dem Crawlen vieler Posts haben Lösungen, die NamespacePrefixMapper verwenden, eine Abhängigkeit von der JDK-Version (wodurch der Code in Zukunft möglicherweise beschädigt wird) oder die XML-DOM-Baummanipulation sieht kompliziert aus.

Mein Brute-Force-Ansatz besteht darin, das generierte XML selbst zu manipulieren.

%Vor%

Die Ausgabe zeigt, dass der nicht verwendete xmlns-Namespace herausgefiltert wird:

%Vor%     
oraclesoon 17.02.2017 04:44
quelle

Tags und Links