7 Stimmen

JAXB fügt Namespace zum übergeordneten Element hinzu, aber nicht zu den enthaltenen untergeordneten Elementen

Ich habe eine XSD erstellt und JAXB verwendet, um daraus Klassen zu generieren.

Hier sind meine XSDs

myDoc.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.mydoc.org"
       targetNamespace="http://www.mydoc.org"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:mtp="http://www.mytypes.com" elementFormDefault="qualified">

<xs:import namespace="http://www.mytypes.com" schemaLocation="mytypes.xsd" />
<xs:element name="myDoc">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="crap" type="xs:string"/>
      <xs:element ref="mtp:foo"/>
      <xs:element ref="mtp:bar"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

mytypes.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.mytypes.com"
       xmlns="http://www.mytypes.com"
       xmlns:tns="http://www.mytypes.com"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       attributeFormDefault="qualified" elementFormDefault="qualified">

  <xs:element name="foo" type="tns:Foo"/>
  <xs:element name="bar" type="tns:Bar"/>
  <xs:element name="spam" type="tns:Spam"/>

  <xs:simpleType name="Foo">
    <xs:restriction base="xs:string"></xs:restriction>
  </xs:simpleType>

  <xs:complexType name="Bar">
    <xs:sequence>
      <xs:element ref="spam"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="Spam">
    <xs:restriction base="xs:string" />
  </xs:simpleType>

</xs:schema>

Das zugehörige Dokument ist

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myDoc xmlns:ns2="http://www.mytypes.com">
  <crap>real crap</crap>
  <ns2:foo>bleh</ns2:foo>
  <ns2:bar>
    <spam>blah</spam>
  </ns2:bar>
</myDoc>

Beachten Sie, dass die <spam> Element verwendet den Standard-Namensraum. Ich möchte, dass es den ns2 Namensraum. Das Schema (mytypes.xsd) drückt die Tatsache aus, dass <spam> ist enthalten in <bar> die in der XML-Instanz an den ns2 Namensraum.

Ich zerbreche mir seit über einer Woche den Kopf darüber und würde gerne ns2 Präfix erscheint in <spam> . Was soll ich tun?

Erforderlich:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myDoc xmlns:ns2="http://www.mytypes.com">
  <crap>real crap</crap>
  <ns2:foo>bleh</ns2:foo>
  <ns2:bar>
    <ns2:spam>blah</ns2:spam><!--NS NS NS-->
  </ns2:bar>
</myDoc>

2voto

Tushar Punkte 21

Prüfen, ob den Feldern in einer generierten Klasse die @XmlElement-Annotation fehlt und, falls vorhanden, ob ihnen das Namespace-Attribut fehlt. Diese beiden müssen vorhanden sein, um das Namespace-Präfix für jedes Element in der marshaled xml zu erhalten

0voto

Julien Rentrop Punkte 641

Ich habe versucht, Ihr Problem zu reproduzieren, aber hier funktioniert es korrekt: Beim Marshalling erhält das Spam-Element einen ns2-Namespace.

Mein Rangiercode:

    Bar bar = new Bar();
    bar.setSpam("s");

    MyDoc myDoc = new MyDoc();
    myDoc.setBar(bar);

    JAXBContext context = JAXBContext.newInstance("org.mydoc");

    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(myDoc, System.out);

Ausgabe:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myDoc xmlns="http://www.mydoc.org" xmlns:ns2="http://www.mytypes.com"><ns2:bar><ns2:spam>s</ns2:spam></ns2:bar></myDoc>

Meine JAXB-Version:

xjc version "JAXB 2.1.3 in JDK 1.6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build IBM JAXB 2.1.3 in JDK 1.6)

EDITAR:

Die Klasse Bar.java hat die folgende Anmerkung:

@XmlElement(required = true)
protected String spam;

Das XmlElement hat auch ein Namespace-Attribut. Javadoc: [http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace()](http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace())

Standardmäßig wird die @XmlSchema-Anmerkung im com.mytypes-Paket berücksichtigt. Haben Sie die @XmlSchema-Anmerkung und/oder die Datei package-info.java entfernt?

0voto

Nishant Punkte 71

Package-info.java wurde von meinem Build-System nicht kompiliert, so dass elementFormDefault="qualified" und der Ziel-Namespace nicht in die von Jaxb annotierten Klassen aufgenommen wurden.

Wenn Sie dieses Verhalten feststellen, stellen Sie sicher, dass Ihre package-info.java in eine .class-Datei kompiliert wird und sich in Ihrem Klassenpfad befindet.

Salud.

0voto

Glenn Bech Punkte 5948

Dieser Fehler tritt auch auf, wenn Sie mit Maven 2 und dem folgenden jaxws-maven-plugin bauen.

 <groupId>org.codehaus.mojo</groupId>
 <artifactId>jaxws-maven-plugin</artifactId>

Und aus irgendeinem Grund habe ich das maven-compiler-plugin für java 1.5 konfiguriert. Die Einstellung target/source auf 1.6 behebt das Problem.

 <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        </configuration>
 </plugin>

Wenn Sie wissen, warum, können Sie gerne einen Kommentar abgeben.

0voto

VirajC Punkte 68

Sie können es in Ihrer package-info.java angeben in der @XmlSchema-Anmerkung angeben.

elementFormDefault=XmlNsForm.QUALIFIED

beispiel paket-info.java

@XmlSchema(
    namespace="desiredNamespace",   
    // If qualified namespace will be added to all elements
    elementFormDefault = XmlNsForm.QUALIFIED,
    // If qualifies namespace will be added to all attributes
    attributeFormDefault = XmlNsForm.UNQUALIFIED,
    xmlns = {   
        @XmlNs(prefix = "xsd", namespaceURI = "desiredNamespace"),
        @XmlNs(prefix = "xsi", namespaceURI = "anotherLink"),
    }
)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X