Tapas Biswas
Tapas Biswas

Reputation: 13

Different parent child namespace prefix expected

I have two xsds from which i have generated jaxb pojos using xjc. And i have generated XMLs using jaxb marshaller with jaxb-impl-2.2.6 For this I have overriden NamespacePrefixMapper as MyNamespacePrefixMapper

Parent.xsd

 <xs:schema targetNamespace="parent" 
       elementFormDefault="qualified" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:Env="Parent" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:child="urn:xsd:child">
<xs:import namespace="urn:xsd:child" schemaLocation="child.xsd"/>
<xs:element name="parent">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="child" type="child:child1"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
 </xs:schema>

child.xsd

  <xs:schema xmlns="urn:xsd:child" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:xsd:child">
<xs:element name="child" type="child1"/>
<xs:complexType name="child1">
    <xs:sequence>
        <xs:element name="Id" type="Max20Text"/>    
    </xs:sequence>
</xs:complexType>
<xs:simpleType name="Max20Text">
    <xs:restriction base="xs:string">
        <xs:minLength value="1"/>
        <xs:maxLength value="20"/>
    </xs:restriction>
</xs:simpleType>

XmlMarshallingTest.java

 import javax.xml.bind.*;
 import javax.xml.stream.XMLStreamException;
 import org.junit.Test;
 import parent.Parent;
 import xsd.child.Child1;
  public class XmlMarshallingTest {


  @Test
   public void testXmlMarshalling() throws  JAXBException, XMLStreamException{
    Parent envelope = new Parent();
    Child1 businessApplicationHeaderV01 = new Child1();
    businessApplicationHeaderV01.setId("ABC123");
    envelope.setChild(businessApplicationHeaderV01);
    JAXBContext context = JAXBContext.newInstance(envelope.getClass());
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespacePrefixMapper());
    marshaller.marshal(envelope, System.out);
    }
}

MyNamespacePrefixMapper.java

    import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
    import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

    public class MyNamespacePrefixMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean arg2) {
    if("Parent".equals(namespaceUri)) {
        return "parentPrefix";
    } else if("urn:xsd:child".equals(namespaceUri)) {
        return "childPrefix";
    }
    return "defaultPrefix";
}
  }

the generated xml is like

 <parentPrefix:parent xmlns:childPrefix="urn:xsd:child" xmlns:parentPrefix="parent">
   <parentPrefix:child>
    <childPrefix:Id>ABC123</childPrefix:Id>
   </parentPrefix:child>
 </parentPrefix:parent>

Here, my problem is , I expect the xml to be look like following

 <parentPrefix:parent xmlns:childPrefix="urn:xsd:child" xmlns:parentPrefix="parent">
  <childPrefix:child>
    <childPrefix:Id>ABC123</childPrefix:Id>
  </childPrefix:child>
 </parentPrefix:parent>

I expect the prefix of child tag to be "childPrefix" but it shows "parentPrefix" The parent tag is well generated with prefix "parentPrefix"

Environment Description

Maven 3.0.4

Java version: 1.7.0_04

OS : windows 7

Upvotes: 1

Views: 1215

Answers (1)

Ian Roberts
Ian Roberts

Reputation: 122364

Your schema defines the parent element as having a child element named child in the parent schema's own targetNamespace, whose type happens to come from the child namespace. If you want the parent to use the child element that is defined in the child schema (and thus in the urn:xsd:child namespace) then instead of

<xs:element name="child" type="child:child1"/>

you need

<xs:element ref="child:child"/>

Upvotes: 2

Related Questions