2016-08-08 4 views
0

xmlstreamwriter와 jaxb를 함께 사용하여 큰 xml 파일을 마샬링합니다. 내가 JAXB와 하위 트리를 만드는 오전하지만 난 그것을 다음과 같이 기본 네임 스페이스로 시작되는 하위 트리 마샬링 할 때이 문제는 다음과 같습니다XmlstreamWriter 및 Jaxb (서브 트리 없음) 네임 스페이스

<?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> 

내가 마샬링에 대한 코드 아래 사용하고을 :

 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()); 

기본 네임 스페이스를 설정 중이지만 여전히 네임 스페이스가있는 하위 트리를 만듭니다. jaxb하지만 네임 스페이스없이 하위 트리를 생성하려면 어떻게해야합니까?

답변

1

QName을 사용하는 방식이 잘못되었습니다. 처음 사용했을 때 비슷한 문제가있었습니다.

localName (하나의 String 생성자)을 단순히 지정하면 네임 스페이스가 비어 있다고 가정합니다. 이것이 MessageHeader의 태그가 xmlns="" 인 이유입니다. 자세한 내용은 here을 참조하십시오.

사용해야하는 생성자는 this입니다.

이 하나 현재의 QName를 교체하고 그것을 작동합니다 :

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

또한, 당신은 기본 네임 스페이스와 동일한 일이

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

필요하지 않습니다.