在JAXB中编组/解组时匹配命名空间
我使用JAXB来编组/解组XML。如果我像这样编组XML文件:
<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>
<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>
然后尝试解组它,我明白了:
<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,我需要能够 从JAXB unmarshaller那里得到前缀和它们的uris,我似乎无法得到它。
因此,如果有人对NamespaceContext解决方案有任何建议,或者确实有其他方法,我会很感激。
答案 0 :(得分:0)
快速查看看似符合命名空间的XML文档后,使用不同的前缀。不同的JAXB实现提供了不同的机制来控制使用的前缀,但将涉及您的交互:
JAXB RI / Metro JAXB
JAXB RI / Metro提供名为NamespacePrefixMapper
的扩展程序:
EclipseLink JAXB(MOXy)
MOXy(我是技术主管)将使用@XmlSchema
注释中指定的前缀。在下面的示例中,atom
前缀将用于http://www.w3.org/2005/Atom
命名空间URI。
javax.xml.bind.annotation.XmlSchema(
xmlns = {
@javax.xml.bind.annotation.XmlNs(prefix = "atom", namespaceURI = "http://www.w3.org/2005/Atom")
})
package org.example.domain;