2016-08-08 4 views
0

xmlstreamwriterとjaxbを組み合わせて使用​​して、大きなxmlファイルをマーシャリングします。私は、JAXBとサブツリーを作成していますが、私はそれは以下のようにデフォルトの名前空間接頭辞れるサブツリーをマーシャリングする際の問題は、次のとおりです。XmlstreamWriterとJaxb for subtree w/oネームスペース

<?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(1つのStringコンストラクタ)を指定すると、名前空間が空であるとみなされます。これは、MessageHeaderにタグxmlns=""がある理由です。詳しくはhereをご覧ください。

使用するコンストラクタはthisです。

は、この1とあなたの現在のQNameを交換し、それが動作するはずです:

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

また、あなたはそれがデフォルトの名前空間のと同じことだ

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

を必要としません。

関連する問題