JAXB генерирует XML с пространством имен для каждого элемента - PullRequest
1 голос
/ 27 января 2012

Как мне сгенерировать XML с помощью следующей схемы, используя 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>

Я не знаю, как сказать 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>

1 Ответ

4 голосов
/ 27 января 2012

Для этого случая использования я бы сделал следующее:

  1. Создание StAX XMLStreamWriter
  2. Запись элементов getRatesResponse и response непосредственно в XMLStreamWriter
  3. Установите следующее свойство на marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);, чтобы предотвратить запись заголовка при каждом вызове маршала.
  4. Маршал для каждого из Rate объектов XMLStreamWriter индивидуально.
  5. В Marshaller установите для него экземпляр NamespacePrefixMapper для управления префиксом пространства имен (для этого в настоящее время требуется RI JAXB, в настоящее время добавлена ​​поддержка этого расширения в EclipseLink JAXB (MOXy) ).

Для получения дополнительной информации

...