【问题标题】:JAXB: How to change XJC-generated classes names when attr type is specified in XSD?JAXB:如何在 XSD 中指定 attr 类型时更改 XJC 生成的类名称?
【发布时间】:2011-01-25 12:43:04
【问题描述】:

我是 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 的人喜欢这种方式。 我想可能有一种方法可以使用自定义绑定,但我仍然没有找到方法。

有什么帮助吗?

谢谢, 米格尔

【问题讨论】:

  • 你能分享你最后使用的命令行吗?

标签: types xsd jaxb xjc


【解决方案1】:

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

【讨论】:

  • 谢谢布莱斯。我无法更改 xsd,因此必须使用外部绑定文件来完成。到目前为止,我正在按照你说的做,但我想做更通用的。也就是说,如果我有一个 'type' 指向复杂类型的元素,我可以管理编译创建一个名称是元素名称而不是复杂类型名称的类吗?
  • 我的意思是,如果将来创建 xsd 的人在 xsd 中添加一个新的 ,我可以重复使用它吗绑定文件,自动生成Car类,不需要修改绑定文件?
  • 我使用 Blaise 建议的上述标签并得到以下错误:解析模式... [错误] 编译器无法实现此类自定义。它附加到错误的位置,或者与其他绑定不一致。 file:/C:/subhasish/demo/src/main/java/demo.xml 的第 8 行 [错误](上述自定义附加到 sc hema 中的以下位置) file:/C:/subhasish 的第 4 行/demo/src/main/java/demo.xsd 解析模式失败。
  • 嗨,这里是 xjc 和 wsdl noob,您能解释一下 xs:complexType 是什么以及如何列出这些吗?我怎么知道我的叫什么?
【解决方案2】:

好吧,我终于找到了方法。我的外部绑定文件是:

<?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(新链接)

问候, 米格尔

【讨论】:

    【解决方案3】:

    这是我用来重命名复杂类型的外部绑定文件。使用 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>
    

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2015-10-09
      • 2012-09-25
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多