¿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 № 1Para este caso de uso, haría lo siguiente:
- Crea un StAX
XMLStreamWriter
- Escribe el
getRatesResponse
yresponse
elementos directamente a laXMLStreamWriter
- Establezca la siguiente propiedad en
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
para evitar que se escriba el encabezado en cada llamada al mariscal. - Marshal cada uno de los
Rate
objetos a laXMLStreamWriter
individualmente. - 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