当使用 JAXB 将对象编码为 XML 时,它会自动生成命名空间前缀,例如 ns2:
。遗憾的是,我必须与之通信的系统无法使用这些默认前缀(尽管 XML 完全有效),因此我想为所有不同的命名空间创建前缀的映射。 XSD 还用于其他项目,因此我不想对其进行任何更改。
我在其他答案和其他网站上找到了 2 个解决方案:
使用命名空间前缀映射器类。听起来很完美,但不幸的是,这不再是一个选项,因为编码器上不再存在相关属性(使用 jakarta.xml.bind:jakarta.xml.bind-api:4.0.0 )。
在
package-info.java
中添加XmlNs
注释。这似乎是剩下的唯一选项(除了编码后在 XML 文件中搜索/替换之外),但生成了此文件:所有 Java 类都是使用 Gradle 通过 XJC 任务从 XSD 生成的。手动添加此类注释到包信息文件将被下次运行的生成任务覆盖。
我的问题:有没有办法为 JAXB 提供我自己的前缀映射?或者有没有办法让 XJC 自动生成这些 XmlNs 注释?
最佳答案
HiSrc HyperJAXB Annox提供了一个XJC插件,可以将Java注释添加到生成的package-info.java
中。您可以添加注释来指定自定义 xmlns
。要使用它,请将 jar(如下)添加到您的 XJC 类路径中,并将此参数添加到您的 XJC 调用中,-Xannotate
。
XJC 附加 Jar
<groupId>org.patrodyne.jvnet</groupId>
<artifactId>hisrc-hyperjaxb-annox-plugin</artifactId>
<version>2.1.0</version>
在绑定(bind)文件中的任意一个 complexType
处配置 annox
扩展,如下所示...
绑定(bind)示例
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings jaxb:version="3.0"
xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:annox="http://jvnet.org/basicjaxb/xjc/annox"
jaxb:extensionBindingPrefixes="annox"
>
<jaxb:bindings schemaLocation="PurchaseOrder.xsd" node="/xsd:schema" >
<jaxb:bindings node="xsd:element[@name='purchaseOrder']/xsd:complexType">
...
<annox:annotatePackage>
@jakarta.xml.bind.annotation.XmlSchema(
xmlns = {
@jakarta.xml.bind.annotation.XmlNs(prefix = "po", namespaceURI = "http://example.org/po")
})
</annox:annotatePackage>
...
</jaxb:bindings>
</jaxb:bindings>
每次在构建中运行 XJC 操作时,package-info.java
类都应包含您定义的 XmlNs
前缀。
免责声明:我是 fork HiSrc 项目的维护者。
顺便说一句,在 Eclipse JAXB implementation ,NamespacePrefixMapper
及其属性可以在以下位置找到:
Mapper: org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper
Used By: org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl
Property: org.glassfish.jaxb.namespacePrefixMapper
关于xml - 如何使 JAXB 使用自定义命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76541552/