How can i remove namespace from the generated JAXB File?
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>
Dupont
Updated on June 18, 2022Comments
-
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 almost 13 yearsThe 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?
-