JAXB:为什么在生成的xml文档中不使用已定义的名称空间前缀?
您好,我使用xic编译器从一个xml模式文件(mets.xsd)java类生成。此xsd文件使用一些其他名称空间(premis.xsd、ead.xsd…)。为了使用名称空间前缀,我在package-info.java文件中添加了一些注释,如下所示: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
@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);