JAXB Fragment Marshal w/o namespace

前端 未结 3 813
时光说笑
时光说笑 2021-02-05 21:18

I\'m using the JAXB_FRAGMENT property for my marshaller to marshal at the WorkSet level. The problem is that when I marshal it\'s giving the WorkSet element the xmlns attribute

相关标签:
3条回答
  • 2021-02-05 21:26

    Assuming you want the default namespace for your document to be http://www.namespace.com, you could do the following:

    Demo

    The XMLStreamWriter.setDefaultNamespace(String) and XMLStreamWriter.writeNamespace(String, String) methods will be used to set and write the default namespace for the XML document.

    package forum9297872;
    
    import javax.xml.bind.*;
    import javax.xml.stream.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
            writer.setDefaultNamespace("http://www.namespace.com");
    
            JAXBContext jc = JAXBContext.newInstance(WorkSet.class);
            Marshaller m = jc.createMarshaller();
            m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    
            writer.writeStartDocument();
            writer.writeStartElement("http://www.namespace.com", "Import");
            writer.writeNamespace("", "http://www.namespace.com");
            writer.writeStartElement("WorkSets");
    
            m.marshal(new WorkSet(), writer);
            m.marshal(new WorkSet(), writer);
    
            writer.writeEndDocument();
            writer.close();
        }
    
    }
    

    WorkSet

    My assumption is that you have specified namespace information in your JAXB model.

    package forum9297872;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name="WorkSet", namespace="http://www.namespace.com")
    public class WorkSet {
    
    }
    

    Output

    Below is the output from running the demo code:

    <?xml version="1.0" ?><Import xmlns="http://www.namespace.com"><WorkSets><WorkSet></WorkSet><WorkSet></WorkSet></WorkSets></Import>
    
    0 讨论(0)
  • 2021-02-05 21:26

    Just another example:

        try {
            JAXBContext customerInformationRequestContext = JAXBContext.newInstance(CustomerInformationRequest.class);
            Unmarshaller unmarshaller = customerInformationRequestContext.createUnmarshaller();
            StringReader stringReader = new StringReader(requestPayload);
            XMLInputFactory xif = XMLInputFactory.newFactory();
            XMLStreamReader xsr = xif.createXMLStreamReader(stringReader);
            XMLStreamReaderWrapper reader = new XMLStreamReaderWrapper(xsr);
            CustomerInformationRequest customerInformationRequest = (CustomerInformationRequest) unmarshaller.unmarshal(reader);
            CustomerInformationResponse customerInformationResponse = customerLookup(customerInformationRequest, sessionTransaction);
            JAXBContext customerInformationResponseContext = JAXBContext.newInstance(CustomerInformationResponse.class);
            Marshaller marshaller = customerInformationResponseContext.createMarshaller();
            StringWriter stringWriter = new StringWriter();
            XMLOutputFactory xof = XMLOutputFactory.newFactory();
            XMLStreamWriter xsw = xof.createXMLStreamWriter(stringWriter);
            xsw = new XMLStreamWriterWrapper(xsw);
            marshaller.marshal(customerInformationResponse, xsw);
            String responsePayload = stringWriter.toString();
            return responsePayload;
        } catch (Exception e) {
            log.debug("The payload could not be unmarshalled.", e);
            return null;
        }
    
    0 讨论(0)
  • 2021-02-05 21:46

    There are three workarounds for this.

    1) Create JAXB annotated objects for the container of your workersets. Add the workersets to that object and then marshal the whole thing.

    2) Follow the first example in 101 ways to marshal objects with JAXB and use DocumentBuilderFactory with namespace aware.

    3) Assuming that the jaxb object is in a package that should never have qualified namespaces you can add the following to the package annotation: (note: it's been a while since i've done this and I havn't tested this code)

    @XmlSchema(namespace = "", elementFormDefault = XmlNsForm.UNQUALIFIED) 
    package example;
    
    0 讨论(0)
提交回复
热议问题