/ / JAXBは、各要素の名前空間でxmlを生成します-java、xml、namespaces、jaxb、xml-namespaces

JAXBは、各要素(java、xml、namespace、jaxb、xml-namespaces)の名前空間でxmlを生成します。

jaxbを使用して次のスキーマでxmlを生成するにはどうすればよいですか。

<NS1:getRatesResponse xmlns:NS1="http://mynamespaceTypes">
<response>
<NS2:rates xmlns:NS2="http://mynamespace">
<currency>USD</currency>

</NS2:rates>
<NS3:rates xmlns:NS3="http://mynamespace">
<currency>EUR</currency>

</NS3:rates>
<NS4:rates xmlns:NS4="http://mynamespace">
... etc
</response>

私は、すべての新しいアイテムが同じ名前空間を持つNS(n + 1)であるべきであることをjaxbに伝える方法を知りません。 XML形式は外部にあるため、変更することはできません。

JAXBはこのxmlを正しく解析しますが、同じクラスを使用して生成する場合、次のように生成します。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns3:getRatesResponse
xmlns:ns2="http://mynamespaceTypes"
xmlns:ns3="http://mynamespace">
<response>
<ns2:rates>
<currency>EUR</currency>

</ns2:rates>
<ns2:rates>
<currency>USD</currency>

</ns2:rates>
</response>
</ns3:getRatesResponse>

回答:

回答№1は4

このユースケースでは、次のことを行います。

  1. StAXを作成する XMLStreamWriter
  2. 書きます getRatesResponse そして response 要素に直接 XMLStreamWriter
  3. 次のプロパティを設定します marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 各マーシャルコールでヘッダーが書き込まれないようにします。
  4. それぞれの元s Rate オブジェクト XMLStreamWriter 個別に
  5. マーシャラーでのインスタンスを設定します NamespacePrefixMapper その上で名前空間プレフィックスを制御します(これには現在JAXB RIが必要です。この拡張機能のサポートは現在追加されています EclipseLink JAXB(MOXy))。

詳細については