如何为XML生成名称空间前缀?

问题描述

我正在使用JAXB生成XML文件java类是从xsd文件生成的,每个软件包都包含一个package-info文件生成的package-info文件为:

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:oasis:names:specification:ubl:schema:xsd:somestatus-2",elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package oasis.names.specification.ubl.schema.xsd.somestatus_2;

当我转换为XML时,名称空间前缀生成为ns#(ns0,ns1 ..)而不是ext,cac等。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns5:SomeStatus xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ns5="urn:oasis:names:specification:ubl:schema:xsd:SomeStatus-2" xmlns:ns2="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:ns4="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:ns3="http://abc.xyz/2009/02/27/ubl20-abc-extensions">
    <ns2:SomeExtensions>
        <ns2:SomeExtension>
            <ID>ID1</ID>
            <ns2:ExtensionAGID>1</ns2:ExtensionAGID>
            <ns2:ExtensionAGName>One</ns2:ExtensionAGName>
        </ns2:SomeExtension>
    </ns2:SomeExtensions>
    <UBLVersionID>1</UBLVersionID>
    <CustomizationID>oneCustomization</CustomizationID>
    <IssueDate>Today</IssueDate>
</ns5:SomeStatus>

但是使用@XmlSchema批注,我可以使用正确的名称空间生成XML。

@javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2",xmlns = {
        @XmlNs(prefix = "",namespaceURI = "urn:oasis:names:specification:ubl:schema:xsd:somestatus-2"),@XmlNs(prefix = "abc",namespaceURI = "http://abc.xyz/2009/02/27/ubl20-abc-extensions"),@XmlNs(prefix = "ext",namespaceURI = "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"),@XmlNs(prefix = "cbc",namespaceURI = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"),@XmlNs(prefix = "cac",namespaceURI = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2") })
package oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_2;

import javax.xml.bind.annotation.XmlNs;

这样可以正确命名空间

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SomeStatus xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns="urn:oasis:names:specification:ubl:schema:xsd:SomeStatus-2" xmlns:abc="http://abc.xyz/2009/02/27/ubl20-abc-extensions" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
    <ext:SomeExtensions>
        <ext:SomeExtension>
            <cbc:ID>ID1</cbc:ID>
            <ext:ExtensionAGID>1</ext:ExtensionAGID>
            <ext:ExtensionAGName>One</ext:ExtensionAGName>
        </ext:SomeExtension>
    </ext:SomeExtensions>
    <cbc:UBLVersionID>1</cbc:UBLVersionID>
    <cbc:CustomizationID>oneCustomization</cbc:CustomizationID>
    <cbc:IssueDate>2020-10-27</cbc:IssueDate>
    <cbc:IssueTime>09:37:02Z</cbc:IssueTime>
    <cac:SomeEvent>
        <cac:ReportedPackage>
            <cac:SomeHandlingUnit>
                <cac:ReceivedHandlingUnitRLine>
                    <cac:Package>
                        <cac:PackageStage>
                            <cbc:ID>23579</cbc:ID>
                        </cac:PackageStage>
                    </cac:Package>
                </cac:ReceivedHandlingUnitRLine>
            </cac:SomeHandlingUnit>
        </cac:ReportedPackage>
    </cac:SomeEvent>
</SomeStatus>

问题在于package-info是一个生成文件。这些更改是手动完成的,在重新编译时会丢失。有什么方法可以完整生成这些设置的package-info吗?或通过其他任何方式生成将在打包信息生成后更改其内容生成过程。

此外,如果生成名称空间前缀为ns#,那么对于XML解析器来说是否真的是一个问题。我问是因为两种情况下的值/ URL都相同,但是前缀不同?

(Maven用于打包项目)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)