Соответствующие пространства имен при маршалинге / демаршаллинге в JAXB - PullRequest
1 голос
/ 02 ноября 2011

Соответствие пространств имен при маршалинге / демаршаллинге в JAXB

Я использую JAXB для маршалинга / демаршаллинга XML.Если я маршаллизирую XML-файл, подобный этому:

</p> <pre><code><om:RequestCreateEvent xmlns:om="http://ossj.org/xml/OrderManagement/v1-0" xmlns:v1="http://ossj.org/xml/Common/v1-5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v11="http://ossj.org/xml/Common-CBECore/v1-5" xmlns:v12="http://ossj.org/xml/Common-CBEBi/v1-5"> <om:event> <v1:applicationDN>System/JSR264/ApplicationType/OrderManagement/Application/1-0;1-0-2;ReferenceImplementation/</v1:applicationDN> <v1:eventTime>2008-11-12T07:39:34.896+01:00</v1:eventTime> <om:requestValue xmlns:v1="http://ossj.org/xml/om/ri/omimpl/v1-0" xsi:type="v1:ProductOrderImplValue"> <v13:key xmlns:v1="http://ossj.org/xml/OrderManagement/v1-0" xmlns:v13="http://ossj.org/xml/Common/v1-5" xsi:type="v1:ProductOrderKey"> <v13:type>http://ossj.org/xml/om/ri/omimpl/v1-0#ProductOrderImplValue</v13:type> <v13:primaryKey>12</v13:primaryKey> </v13:key> <v1:requestState>open.not_running.not_started</v1:requestState> <v12:description xsi:nil="true"/> </om:requestValue> </om:event> </om:RequestCreateEvent>

, а затем впоследствии пытаюсь его демаршировать, я получаю это: </p> <pre><code><ns4:RequestCreateEvent xmlns="http://ossj.org/xml/Common/v1-5" xmlns:ns2="http://ossj.org/xml/Common-CBECore/v1-5" xmlns:ns3="http://ossj.org/xml/Common-CBEBi/v1-5" xmlns:ns4="http://ossj.org/xml/OrderManagement/v1-0" xmlns:ns5="http://ossj.org/xml/om/ri/omimpl/v1-0" xmlns:ns6="http://ossj.org/xml/Common-CBEDatatypes/v1-5" xmlns:ns7="http://ossj.org/xml/Common-CBELocation/v1-5" xmlns:ns8="http://ossj.org/xml/Common-CBEResource/v1-5" xmlns:ns9="http://ossj.org/xml/Common-CBEService/v1-5" xmlns:ns10="http://ossj.org/xml/Common-CBEProduct/v1-5" xmlns:ns11="http://ossj.org/xml/Common-CBEProductOffering/v1-5" xmlns:ns12="http://ossj.org/xml/Common-CBEParty/v1-5"> <ns4:event> <applicationDN>System/JSR264/ApplicationType/OrderManagement/Application/1-0;1-0-2;ReferenceImplementation/</applicationDN> <eventTime> 2008-11-12T07:39:34.896+01:00</eventTime> <ns4:requestValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns5:ProductOrderImplValue"> <key xsi:type="ns4:ProductOrderKey"> <type> http://ossj.org/xml/om/ri/omimpl/v1-0#ProductOrderImplValue</type> <primaryKey/> </key> <ns5:requestState>open.not_running.not_started</ns5:requestState> <ns3:description xsi:nil="true"/> </ns4:requestValue> </ns4:event> </ns4:RequestCreateEvent>

Мне нужно убедиться, что префиксы, используемые в пространствах имен, когда я маршаллизирую сгенерированный jaxb pojo для создания файла XML, соответствуют тем, которые используются, когда я отменяю маршалинг одного и того же файла.

Возможно, есть решение в использовании NamespaceContext, когда я делаю сортировку.Однако я не могу жестко закодировать префиксы и их Uris в реализации NamespaceContext, потому что у меня нет этой информации, доступной для меня (я использую много схем и т. Д.).Так что, если бы я попытался использовать NamespaceContext, мне нужно было бы иметь возможность получить префиксы и их Uris от unmarshaller JAXB, который я, похоже, не могу получить.

Так что, если у кого-то есть какие-либо предложения по решению NamespaceContextили действительно какой-то другой подход, я был бы признателен.

1 Ответ

0 голосов
/ 02 ноября 2011

После быстрого просмотра ваших XML-документов, которые выглядят как пространства имен, имеют одинаковые значения, но используют разные префиксы.Различные реализации JAXB предоставляют разные механизмы для управления используемыми префиксами, но будут включать взаимодействие с вашей стороны:

JAXB RI / Metro JAXB

JAXB RI / Metro предлагаетрасширение называется NamespacePrefixMapper:

EclipseLink JAXB (MOXy)

MOXy (я технический руководитель) будет использовать префиксы, указанные в аннотации @XmlSchema.В приведенном ниже примере префикс atom будет использоваться для URI пространства имен http://www.w3.org/2005/Atom.

javax.xml.bind.annotation.XmlSchema(  
    xmlns = {  
          @javax.xml.bind.annotation.XmlNs(prefix = "atom", namespaceURI = "http://www.w3.org/2005/Atom")  
            })  
    package org.example.domain;  
...