Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB: How do I annotate classes so that they belong to different namespaces?

I want to have JAXB-annotated classes which would be marshalled/unmarshalled to different XML namespaces.

What I need is something like:

<someRootElement xmlns="urn:my:ns1"
    xmlns:a="urn:my:ns2" xmlns:b="urn:my:ns3">

  <someElement/>
  <a:someElement/>
  <b:someElement/>

</someRootElement>

How can it be done?

Can it be done programatically? (without the need for JAXB's .xjb bindings file?)

like image 945
ivan_ivanovich_ivanoff Avatar asked May 15 '09 20:05

ivan_ivanovich_ivanoff


1 Answers

@XmlRootElement(name="someRootElement", namespace = "urn:my:ns1")
class Test {
    @XmlElement(name="someElement", namespace="urn:my:ns1")
    String elem1 = "One";

    @XmlElement(name="someElement", namespace="urn:my:ns2")
    String elem2 = "Two";

    @XmlElement(name="someElement", namespace="urn:my:ns3")
    String elem3 = "Three";
}

This marshals into the following XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<someRootElement xmlns="urn:my:ns1" xmlns:ns2="urn:my:ns2" xmlns:ns3="urn:my:ns3">
    <someElement>One</someElement>
    <ns2:someElement>Two</ns2:someElement>
    <ns3:someElement>Three</ns3:someElement>
</someRootElement>

If you are using JAXB RI and don't like the default ns2 and ns3 namespace prefixes, you need to provide your own NamespacePrefixMapper.

like image 119
andri Avatar answered Oct 07 '22 19:10

andri