views:

511

answers:

4

I put together an XSD and used JAXB to generate classes out of it.

Here are my 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>

The document marshalled is-

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

Note that the <spam> element uses the default namespace. I would like it to use the ns2 namespace. The schema (mytypes.xsd) expresses the fact that <spam> is contained within <bar> which in the XML instance is bound to the ns2 namespace.

I've broken my head over this for over a week and I would like ns2 prefix to appear in <spam>. What should I do?

Required :

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

I have tried to reproduce your problem, but here it's working correctly: When marshalling the spam element does get a ns2 namespace.

My marshalling code:

    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);

Output:

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

My 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)

EDIT:

The Bar.java class does have the following annotation:

@XmlElement(required = true)
protected String spam;

The XmlElement also has a namespace attribute. Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace()

By default it will look at the @XmlSchema annotation in the com.mytypes package. Did you remove the @XmlSchema annotation and/or the package-info.java file?

Julien Rentrop
I'm using JaxB-2.1.11 with JDK1.5. I haven't hand-edited the generated classes and the package-info.java file.Bar.java is annotated with-@XmlType(name = "Bar" namespace="http://www.mytypes.com" propOrder = {"spam"})package-info.java contains@XmlSchema(namespace="http://www.mydoc.org", elementFormDefault=XmlNsForm.QUALIFIED)
Nishant
Interestingly I can marshall a document and unmarshall it back perfectly fine. AFAIU, the XML instance states the <spam> belongs to the null namespace and its definition should not be found
Nishant
A: 

package-info.java was not being compiled by my build system and hence elementFormDefault="qualified" and the target namespace did not make it to the Jaxb annotated classes.

If you see this behavior, make sure your package-info.java is being compiled into a .class file and is in your classpath.

Cheers.

Nishant
A: 

This Error also occurs if you build with Maven 2 and the following jaxws-maven-plugin.

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

And for some reason have configured the maven-compiler-plugin for java 1.5. Setting target/source to 1.6 fixes the problem.

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

If you know why, please feel free to comment.

Glenn Bech
A: 
aravind