JAXB:如何在XSD中指定attr类型时更改XJC生成的类名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAXB:如何在XSD中指定attr类型时更改XJC生成的类名?相关的知识,希望对你有一定的参考价值。

我是JAXB的初学者,在使用xjc生成Java类时遇到了烦人的问题。我提供了这样的XSD:

<xs:element name="item" type="itemType"/>  
...   
<xs:complexType name="itemType">
    <xs:attribute name="id" type="xs:string" use="required">
    ...     
</xs:complexType>

和xjc正在生成一个名为ItemType.java的类,但我希望名称为Item.java。也就是说,我希望生成的类就好像XSD是这样的:

<xs:element name="item">
    <xs:complexType>
    <xs:attribute name="id" type="xs:string" use="required">
        ...
    </xs:complexType>
</xs:element>

在任何其他元素上都不会重复使用itemType,只是构造XSD的人喜欢这样。我想可能有一种方法可以使用自定义绑定,但我仍然没有找到如何。

有帮助吗?

谢谢,米格尔

答案

JAXB提供了两种方法来完成此任务:

1.内联方案注释

您可以使用JAXB模式注释来控制类名。

<xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.1">

    <xs:complexType name="itemType">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="Item"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>

2.外部绑定文件

此自定义也可以通过和外部绑定文件完成:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="your-schema.xsd">
            <jxb:bindings node="//xs:complexType[@name='itemType']">
                <jxb:class name="Item"/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

xjc命令行将是:

xjc -d out -b binding.xml your-schema.xsd
另一答案

好吧,我终于找到了怎么做。我的外部绑定文件是:

<?xml version="1.0"?>
<jxb:bindings version="1.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc">

  <jxb:globalBindings>              
    <xjc:simple/>
  </jxb:globalBindings>

</jxb:bindings>

xjc命令必须使用-extension选项执行。

我在这个页面找到了解决方案:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html(编辑:过时的链接)

https://community.oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always(新链接)

此致,米格尔

另一答案

这是我用来重命名复杂类型的外部绑定文件。用cxf的wsdl2java编译。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[1]">
        <jxb:bindings node="//xs:complexType[@name='VatNumber_exception']">
             <jxb:class name="VatNumException"/>
        </jxb:bindings>

    </jaxws:bindings>
</jaxws:bindings>

以上是关于JAXB:如何在XSD中指定attr类型时更改XJC生成的类名?的主要内容,如果未能解决你的问题,请参考以下文章

RAML:如何仅导出特定类型的 XSD

在 Meteor (JavaScript) 中指定内容类型

如何在等待中指定 Typescript Mongoose 模型类型

JAXB xs:maxLength 和 minOccurs="0" 未在 xsd 生成的类中显示

从JAXB的XSD创建XML文件

Jackson:从 XSD 生成 Jackson 类