How can i remove namespace from the generated JAXB File?

13,628

Solution 1

I just delete "ObjectFactory.class" and it works. New code:

JAXBContext context = JAXBContext.newInstance(Player.class);
Unmarshaller decodeur = context.createUnmarshaller();

Solution 2

If your XML schema indicates that the corresponding XML documents should be namespace qualified, then JAXB will generate a Java model with the expected namespace qualification. Below I'll describe a way in which you could leverage a StAX parser to fool JAXB into thinking it is parsing a namespace qualfied document:

Player

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Player", namespace="http://www.example.org/Player")
public class Player {

    private String login;
    private String passwd;

    @XmlElement(name="Login", namespace="http://www.example.org/Player")
    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    @XmlElement(name="Passwd", namespace="http://www.example.org/Player")
    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

}

NamespaceDelegate

We will create an implementation of StreamReaderDelegate. This delegate will report the namespace for all element events to be "http://www.example.org/Player". Note: This trick assumes that all your elements are qualified with the same namespace URI.

import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;

public class NamespaceDelegate extends StreamReaderDelegate {

    private static String NAMESPACE = "http://www.example.org/Player";

    public NamespaceDelegate(XMLStreamReader xsr) {
        super(xsr);
    }

    @Override
    public String getNamespaceURI() {
        return NAMESPACE;
    }

}

Demo

import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Player.class);

        FileInputStream xmlStream = new FileInputStream("input.xml");
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(xmlStream);
        StreamReaderDelegate srd = new NamespaceDelegate(xsr);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Player player = (Player) unmarshaller.unmarshal(srd);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(player, System.out);
    }

}

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<Player>
    <Login>FOO</Login>
    <Passwd>BAR</Passwd>
</Player>
Share:
13,628
Dupont
Author by

Dupont

Updated on June 18, 2022

Comments

  • Dupont
    Dupont almost 2 years

    Here is my code:

    xsdFile:

    <complexType name="Player">
        <sequence>
            <element name="Login" type="string"></element>
            <element name="Passwd" type="string"></element>
        </sequence>
    </complexType>
    
    <element name="Player" type="tns:Player"></element>
    

    Build.xml:

        <exec executable="${javahome}/bin/xjc"  >
    
            <arg value="-extension" />
            <arg value="-b" />
            <arg value="binding.xml" />
            <arg value="-d" />
            <arg value="${sources}" />
            <arg value="-p" />
            <arg value="metier" />
            <arg value="Player.xsd" />
    
        </exec>
    </target>
    

    binding.xml:

    <jxb:bindings 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jxb:extensionBindingPrefixes="xjc" elementFormDefault="qualified" attributeFormDefault="unqualified"
    version="2.1">
    
    <jxb:globalBindings>
        <xjc:simple />
        <xjc:serializable/>
    </jxb:globalBindings>
    

    And finnaly:

    JAXBContext context = JAXBContext.newInstance(Player.class,ObjectFactory.class); Unmarshaller decodeur = context.createUnmarshaller();

    i add "xjc:simple" in order to have @XMLRootElement, but an exception is raised: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.example.org/Player"

    It didn't work correctly because i got this:@XmlRootElement(name = "Player", namespace = "http://www.example.org/Player")

    Instead of just: @XmlRootElement(name = "Player")

    How can i remove this "namespace" ?

    Thanks

    • bdoughan
      bdoughan almost 13 years
      The JAXB code that was generated matches the namespace qualification rules according to your XML schema. Are you sure you want this removed from the generated object model?