2016-08-08 10 views
0

Ich benutze Xmlstreamwriter und Jaxb in Verbindung zu Marshall eine große XML-Datei. Ich schaffe Unterbaum mit jaxb aber das Problem ist, wenn ich den Unterbaum Marschall es mit Standard-Namespace wie unten vorangestellt ist:XmlstreamWriter und Jaxb für Teilbaum ohne Namespace

<?xml version="1.0" encoding="UTF-8"?> 
<MessageModel xmlns="urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19"> 
    <MessageHeader xmlns="" xmlns:ns2="urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19"> 
     <ns2:ProviderID>5922</ns2:ProviderID> 
     <ns2:EffectiveDT>2016-08-08-04:00</ns2:EffectiveDT> 
     <ns2:PartyCount>0</ns2:PartyCount> 
     <ns2:ArrangementCount>1</ns2:ArrangementCount> 
     <ns2:AppMetaDataString>ter</ns2:AppMetaDataString> 
    </MessageHeader> 
</MessageModel> 

ich unten Code verwende für Marshalling:

 StringWriter result = new StringWriter(); 
     MessageHeaderType messageHeaderType = createMessageHeader(objectFactory); 
     JAXBElement<MessageHeaderType> element = new JAXBElement<MessageHeaderType>(new QName("MessageHeader"), MessageHeaderType.class, messageHeaderType); 

     XMLStreamWriter xmlOut = XMLOutputFactory.newFactory().createXMLStreamWriter(result); 
     **//Setting default namespace** 
     xmlOut.setDefaultNamespace("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19"); 
     xmlOut.writeStartDocument(); 
     xmlOut.writeStartElement("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19", "MessageModel"); 
     xmlOut.writeNamespace("", "urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19"); 

     JAXBContext context = JAXBContext.newInstance(MessageHeaderType.class); 
     Marshaller marshaller = context.createMarshaller(); 
     //marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
     marshaller.marshal(element, xmlOut); 


     xmlOut.writeEndDocument(); 
     xmlOut.close(); 
     System.out.println(result.toString()); 

Ich setze Standard-Namespace, aber es erstellt immer noch Sub-Struktur mit Namespace. Was kann ich tun, um Sub-Baum mit Jaxb aber ohne Namespace zu generieren?

Antwort

1

Die Art, wie Sie QName verwendet haben, ist falsch, ich hatte ein ähnliches Problem, als ich es zum ersten Mal verwendete.

Wenn Sie einfach den localName (ein String-Konstruktor) angeben, wird davon ausgegangen, dass der Namespace leer ist. Aus diesem Grund hat MessageHeader ein Tag xmlns="". Lesen Sie mehr dazu here.

Der Konstruktor, den Sie verwenden sollten, ist this.

Ersetzen Sie Ihre aktuellen QName mit diesem und es sollte funktionieren:

new QName("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19", "MessageHeader"); 

Auch brauchen Sie nicht

xmlOut.writeNamespace("", "urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19"); 

Es ist das gleiche wie die Standard-Namespace ein.