xml - 如何使 JAXB 使用自定义命名空间前缀

标签 xml gradle xsd jaxb xjc

当使用 JAXB 将对象编码为 XML 时,它会自动生成命名空间前缀,例如 ns2:。遗憾的是,我必须与之通信的系统无法使用这些默认前缀(尽管 XML 完全有效),因此我想为所有不同的命名空间创建前缀的映射。 XSD 还用于其他项目,因此我不想对其进行任何更改。

我在其他答案和其他网站上找到了 2 个解决方案:

  1. 使用命名空间前缀映射器类。听起来很完美,但不幸的是,这不再是一个选项,因为编码器上不再存在相关属性(使用 jakarta.xml.bind:jakarta.xml.bind-api:4.0.0 )。

  2. 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 implementationNamespacePrefixMapper 及其属性可以在以下位置找到:

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/

相关文章:

java - 如何使用 JAX-B 将两个 XML 合并为一个?

PHP 将 XML 转换为 JSON

xml - Vim - 删除 XML 注释

java - 带有 Spark 的 proto2 无法运行

xml - 如何打开 XML Schema Explorer

java - 类型安全 : Unchecked cast from Object to JAXBElement<User>

java - CXF wsdl2java 不解析目录

c# - 如果可为 null 的属性为 null 或为空,如何从序列化中忽略它?

android - 来自Maven的ActionBarSherlock Gradle依赖项与androidsupportv4发生冲突

android - Gradle Firebase AdMob 依赖项与 app compat v7 28.0.0 冲突