JAXB为每个元素生成带有名称空间的xml

Ald*_*und 2 java xml namespaces jaxb xml-namespaces

我如何使用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>
Run Code Online (Sandbox Code Playgroud)

我不知道如何告诉jaxb每个新项目都应该是具有相同名称空间的NS(n + 1)。更改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>
Run Code Online (Sandbox Code Playgroud)

bdo*_*han 5

对于此用例,我将执行以下操作:

  1. 创建一个StAX XMLStreamWriter
  2. getRatesResponseresponse元素直接写入XMLStreamWriter
  3. 将以下属性设置为on,marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);以防止在每个调度调用中写入标头。
  4. 将每个Rate对象XMLStreamWriter分别编组。
  5. 在Marshaller NamespacePrefixMapper上为其设置一个实例以控制名称空间前缀(当前需要JAXB RI,对此扩展的支持当前已添加到EclipseLink JAXB(MOXy))。

想要查询更多的信息

  • 您需要在marshaller.setProperty(Marshaller.JAXB_FRAGMENT,true);上设置以下属性。 (2认同)