JAXB上下文重命名命名空间并添加xml标头

时间:2017-05-30 01:40:48

标签: java xml jaxb

使用JAXBContext,我有一个包来创建XML头但是命名空间没有正确生成。我需要将XML从第一个更改为第二个。

JAXBContext jaxbContext = JAXBContext
                        .newInstance("com.oracle.xmlns.eos.v2"); 
Marshaller marshaller = jaxbContext.createMarshaller();

来自:

<?xml version="1.0" encoding="UTF-8"?>
    <ns1:DPC
        xmlns:ns2="http://xmlns.oracle.com/EnterpriseObjects/V2"
        xmlns:ns1="http://url/xsd/DPC"
        xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing"
        xmlns:ns0="http://xmlns.oracle.com/EnterpriseObjects/IC/V1"/>

要:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ns1:DPC
            xmlns:ns1="http://url/xsd/DPC"
            xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing"
            xmlns:ns0="http://xmlns.oracle.com/EnterpriseObjects/IC/V1"
            xmlns:coreEB="http://xmlns.oracle.com/EnterpriseObjects/EB/V1"
            xmlns:cc="http://xmlns.oracle.com/EnterpriseObjects/V2"/>

请建议是否可以将第一个更改为第二个。这需要添加xmlns:coreEB="http://xmlns.oracle.com/EnterpriseObjects/EB/V1"并将命名空间从xmlns:ns2="http://xmlns.oracle.com/EnterpriseObjects/V2"重命名为xmlns:cc="http://xmlns.oracle.com/EnterpriseObjects/V2"

1 个答案:

答案 0 :(得分:0)

除了第二个名称空间http://xmlns.oracle.com/EnterpriseObjects/EB/V1

之外,您的变体都是相同的

JAXB marshaller对所有已知的上下文类或包中的命名空间进行编组。 您的示例意味着从包com.oracle.xmlns.eos.v2开始,没有对包含具有http://xmlns.oracle.com/EnterpriseObjects/EB/V1命名空间的JAXB注释的类的包的引用

所以,

首先 - 仔细检查你的JAXB类/包结构,问题就在那里。

第二 - 如果你没有发现差异或不确定...尝试将http://xmlns.oracle.com/EnterpriseObjects /EB/V1命名空间所需的包显式添加到由:分隔的JAXBContext

JAXBContext jaxbContext = JAXBContext
                    .newInstance("com.oracle.xmlns.eos.v2:com.oracle.xmlns.enterpriseobjects.eb.v1"); 

生成的XML中需要名称空间。 也许你没有该命名空间的任何元素或属性,因为JAXB没有发现它是必需的,但命名空间就在那里。

请记住,包必须是JAXB,使用jaxb ObjectFactory类或jaxb.index文件。