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

时间:2020-10-27 14:45:26

标签: java xml jaxb xml-namespaces

我正在使用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用于打包项目)

0 个答案:

没有答案