/ / JAXB genera xml con espacio de nombres para cada elemento: java, xml, espacios de nombres, jaxb, espacios de nombres xml

JAXB genera xml con espacio de nombres para cada elemento - java, xml, espacios de nombres, jaxb, espacios de nombres xml

¿Cómo puedo generar xml con el siguiente esquema usando jaxb?

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

No sé cómo decirle a jaxb que cada elemento nuevo debe ser NS (n + 1) con el mismo espacio de nombres. Cambiar el formato xml no es una opción, porque es externo.

JAXB analiza este xml correctamente, pero cuando produce usando las mismas clases lo produce así:

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

Respuestas

4 para la respuesta № 1

Para este caso de uso, haría lo siguiente:

  1. Crea un StAX XMLStreamWriter
  2. Escribe el getRatesResponse y response elementos directamente a la XMLStreamWriter
  3. Establezca la siguiente propiedad en marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); para evitar que se escriba el encabezado en cada llamada al mariscal.
  4. Marshal cada uno de los Rate objetos a la XMLStreamWriter individualmente.
  5. En el Marshaller establece una instancia de NamespacePrefixMapper en él para controlar el prefijo del espacio de nombres (esto actualmente requiere el JAXB RI, el soporte para esta extensión se está agregando actualmente a EclipseLink JAXB (MOXy))

Para más información