2012-01-27 2 views
1

Как я могу создать xml со следующей схемой с помощью jaxb.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 (п + 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

The внешнего потребителя _requires_ все эти дополнительные пространства имен ?! деклараций Ewww! Получите нового внешнего потребителя. –

+0

Да, я знаю, что это ужасно. Но я ничего не могу с этим сделать, это собственная внутренняя банковская система. – Aldarund

+0

Да, я знаю, что ты застрял. Вот почему я сделал это как комментарий, а не ответ. (Если вы действительно застряли, замените шаблон строки и ненавидите свою жизнь. По крайней мере, данные, вероятно, достаточно просты, чтобы сделать это не очень проблематичным.) –

ответ

4

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

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

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

+0

Как я могу создать нумерованные префиксы в NamespacePrefixMapper? Как я вижу, он получает как пространство имен параметров, так и предлагаемый префикс. Как бы я знал, в генерации метода, какой номер элемента это, и мне нужно знать, чтобы генерировать префиксы ns2, ns3, ns4 и т. Д. Может быть, я что-то упустил? Можете ли вы привести пример использования NamespacePrefixMapper для достижения того, что мне нужно? – Aldarund

+0

В этом подходе каждый экземпляр «Rate» будет рассматриваться как отдельный маршал. Это означает, что у вас есть возможность повлиять на экземпляр «NamespacePrefixMapper» между вызовами маршала. –

+1

А, да, правильно. Но когда я marshell каждый Оценить отдельно для созданного XMLStreamWriter, я получаю эту ошибку: javax.xml.stream.XMLStreamException: не удается вывести объявление XML, после того как другой результат уже выполнен. Похоже, что jaxb попытался вывести . Как сказать ему не делать этого? – Aldarund

Смежные вопросы