JAXB:为什么在生成的xml文档中不使用已定义的名称空间前缀?

JAXB:为什么在生成的xml文档中不使用已定义的名称空间前缀?,jaxb,xml-namespaces,prefix,moxy,Jaxb,Xml Namespaces,Prefix,Moxy,您好,我使用xic编译器从一个xml模式文件(mets.xsd)java类生成。此xsd文件使用一些其他名称空间(premis.xsd、ead.xsd…)。为了使用名称空间前缀,我在package-info.java文件中添加了一些注释,如下所示: @XmlSchema( elementFormDefault=XmlNsForm.QUALIFIED, location="http://www.loc.gov/mets/mets.xsd", namesp

您好,我使用xic编译器从一个xml模式文件(mets.xsd)java类生成。此xsd文件使用一些其他名称空间(premis.xsd、ead.xsd…)。为了使用名称空间前缀,我在package-info.java文件中添加了一些注释,如下所示:

@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED,
    location="http://www.loc.gov/mets/mets.xsd",
    namespace="http://www.loc.gov/METS/",
    xmlns=
    {
            @XmlNs(prefix="METS",   namespaceURI="http://www.loc.gov/mets/"),
            @XmlNs(prefix="EAD",    namespaceURI="http://www.loc.gov/ead/"),
            @XmlNs(prefix="PREMIS", namespaceURI="http://www.loc.gov/premis/v2/"),
            @XmlNs(prefix="xlink",  namespaceURI="http://www.w3.org/1999/xlink"),
            @XmlNs(prefix="OAI_DC", namespaceURI="http://www.openarchives.org/OAI/2.0/oai_dc/"),
            @XmlNs(prefix="DC",     namespaceURI="http://purl.org/dc/elements/1.1/")
    }
)
package ch.eugster.herakles.sip.matterhorn.mets;

import jakarta.xml.bind.annotation.XmlNs;
import jakarta.xml.bind.annotation.XmlNsForm;
import jakarta.xml.bind.annotation.XmlSchema;
当我将java对象整理成xml时,我得到以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:mets xmlns:METS="http://www.loc.gov/mets/" xmlns:EAD="http://www.loc.gov/ead/" xmlns:PREMIS="http://www.loc.gov/premis/v2/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:OAI_DC="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:DC="http://purl.org/dc/elements/1.1/" xmlns:ns1="http://www.loc.gov/METS/" PROFILE="http://www.docuteam.ch/xmlns/sip-profile.xml">
   <ns1:amdSec/>
   <ns1:fileSec>
      <ns1:fileGrp/>
   </ns1:fileSec>
   <ns1:structMap>
      <ns1:div TYPE="rootfolder" ORDER="1" LABEL="RootFolder_Temp"/>
   </ns1:structMap>
</ns1:mets>


正如您所见,前缀定义正确,但未在文档中使用。有人知道这是什么原因吗?非常感谢

甚至我也面临着同样的问题(即使在为我的
QName
提供了
自定义前缀之后,我也得到了默认的名称空间前缀,例如
ns0、ns1等
),所以我尝试了很多方法,最终还是能够得到它,所以在这里发布相同的前缀,以便对您和将来的其他人有所帮助。你可以找到

  • 删除
    包info.java
    及其所有内容(如果您在尝试某些内容时添加了)

  • 由于您使用的是
    Moxy
    ,因此可以创建一个
    Map
    ,其中包含所有必需的
    namepcaeuri和前缀。大概是这样的:

  • 这将确保无论何时遇到
    名称空间
    ,它都会检查相应的
    前缀
    ,并将其添加到
    XML头
    ,因此,它将从映射中将所有默认前缀
    ns0、ns1等
    替换为相应的
    前缀

    完整的示例代码:

    JAXBContext ctx = JAXBContext.newInstance(new Class[] { TestObject.class, SubObject.class });
    Map<String, String> urisToPrefixes = new HashMap<String, String>();
    urisToPrefixes.put("http://www.loc.gov/mets/", "METS");
    urisToPrefixes.put("http://www.loc.gov/ead/", "EAD"); urisToPrefixes.put("http://www.loc.gov/premis/v2/", "PREMIS");
    Marshaller m = ctx.createMarshaller();
    m.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, prefixesToUris);
    
    JAXBContext ctx=JAXBContext.newInstance(新类[]{TestObject.Class,SubObject.Class});
    Map urisToPrefixes=new HashMap();
    urisToPrefixes.put(“http://www.loc.gov/mets/“,”大都会“);
    urisToPrefixes.put(“http://www.loc.gov/ead/“,“EAD”);urisToPrefixes.put(“http://www.loc.gov/premis/v2/“,”PREMIS“);
    Marshaller m=ctx.createMarshaller();
    m、 setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER,prefixesToUris);
    

    如果您想了解更多关于此方法和另一种方法的信息,请查找

    Hi,即使我实际上也面临同样的问题。在创建
    QName
    期间,不使用提供的
    前缀。它总是使用默认的名称空间前缀,例如
    ns0、ns1等
    。我还使用了
    Moxy
    。你找到这个问题的答案了吗?
        marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, urisToPrefixes);
    
    JAXBContext ctx = JAXBContext.newInstance(new Class[] { TestObject.class, SubObject.class });
    Map<String, String> urisToPrefixes = new HashMap<String, String>();
    urisToPrefixes.put("http://www.loc.gov/mets/", "METS");
    urisToPrefixes.put("http://www.loc.gov/ead/", "EAD"); urisToPrefixes.put("http://www.loc.gov/premis/v2/", "PREMIS");
    Marshaller m = ctx.createMarshaller();
    m.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, prefixesToUris);