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

时间:2012-01-27 14:12:43

标签: 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>

我不知道如何告诉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>

2 个答案:

答案 0 :(得分:4)

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

  1. 创建StAX XMLStreamWriter
  2. getRatesResponseresponse元素直接写入XMLStreamWriter
  3. marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);上设置以下属性,以防止在每个编组调用中写入标题。
  4. 将每个Rate个对象分别编组为XMLStreamWriter
  5. 在Marshaller上设置NamespacePrefixMapper的实例来控制命名空间前缀(这当前需要JAXB RI,目前正在将此扩展的支持添加到EclipseLink JAXB (MOXy))。
  6. 了解更多信息

答案 1 :(得分:0)

将这些配置添加到我的方案中解决了我的问题 attributeFormDefault="unqualified" elementFormDefault="qualified"