JAXB:为什么在生成的 xml 文档中没有使用定义的命名空间前缀?

问题描述

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

'a'

当我将 java 对象编组为 xml 时,我得到以下输出

@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;

如您所见,前缀已正确定义,但未在文档中使用。有谁知道,是什么导致了这种情况?非常感谢!

解决方法

即使我也面临着同样的问题(即使在向我的 custom prefix 提供了 QName 之后,我还是得到了默认的命名空间前缀,例如 ns0,ns1,etc)所以我尝试了很多事情并且终于能够得到它,所以在这里发布相同的信息,以便它可以对您和将来的其他人有所帮助。你可以找到my question here

  1. 删除 package-info.java 及其所有内容(如果您在尝试某些操作时添加)。

  2. 由于您使用的是 Moxy,因此您可以使用所有必需的 Map 创建一个 NamespcaeURI and Prefix。像这样:

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"); 
  1. 在使用 Marshalling 方法时添加 property 并将此 Map 作为参数发送:
    marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER,urisToPrefixes);

这将确保每当遇到 Namespace 时,它都会检查相应的 prefix 并将其添加到 XML header 中,因此它会替换所有默认前缀 {{ 1}} 到对应的 ns0,ns1 etc 来自地图。

完整的示例代码:

prefix

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...