JAXB: How can I unmarshal XML without namespaces

I need to figure out a way to deal with the following.

Need to process a XML which is provided by different vendors the schema and structure of these xmls from different vendors are the same. the only difference is in the @XmlRootElement.


This is the name space i originally had

@XmlRootElement(name = "opsReports", namespace= "http://www.witsml.org/schemas/1series")

When I processed the XML file from the second vendor, their namespace was as below



xmlns="http://www.witsml.org/schemas/131"

and this caused the following exception

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.witsml.org/schemas/131", local:"opsReports"). Expected elements are <{http://www.witsml.org/schemas/1series}opsReports>.

I was looking around for a solution, that would help me to remove the namespace from getting generated unmarshalling


Came across the following 

http://stackoverflow.com/questions/7184526/jaxb-how-can-i-unmarshal-xml-without-namespaces/7206666

This post was helpful, so this is what i did to solve the problem


1. Removed the namespace entry from @XmlRootElement

@XmlRootElement(name = "opsReports")
import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
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 {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("\\WITSML_opsReport 20160622-172911.xml"));
        xsr = new XsiTypeReader(xsr);

        JAXBContext jc = JAXBContext.newInstance(OpsReportsJaxb.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        OpsReportsJaxb spec = (OpsReportsJaxb) unmarshaller.unmarshal(xsr);
        System.out.println(spec);
    }

    private static class XsiTypeReader extends StreamReaderDelegate {
        public XsiTypeReader(XMLStreamReader reader) {
            super(reader);
        }
        @Override
        public String getNamespaceURI() {
            return "";
        }
    }
}

Hope this helps :))

No comments:

Common JPA explanations

**This is just for reference only, most of the source of these infor is taken from stackoverflow.  When to use eager loading In "one si...

Popular in last 30 days