JAXB:如何在XSD中指定attrtypes时更改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的人喜欢这种方式。 我想可能有办法做到这一点与自定义绑定,但我还没有find如何。

任何帮助?

谢谢米格尔

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 

那么,我终于find了如何去做。 我的外部绑定文件是:

 <?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选项执行。

我在这个页面find了解决scheme:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html

问候,米格尔

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