问题描述
您好,我使用 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
-
删除
package-info.java
及其所有内容(如果您在尝试某些操作时添加)。 -
由于您使用的是
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");
- 在使用
Marshalling
方法时添加property
并将此Map
作为参数发送:
marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER,urisToPrefixes);
这将确保每当遇到 Namespace
时,它都会检查相应的 prefix
并将其添加到 XML header
中,因此它会替换所有默认前缀 {{ 1}} 到对应的 ns0,ns1 etc
来自地图。
完整的示例代码:
prefix
如果您想了解更多关于此和另一种方法的信息,请查找 documentation here: