2011-01-25 39 views
34

我是JAXB的初學者,在使用xjc生成Java類時遇到了煩人的問題。我提供了這樣一個XSD:JAXB:如何在XSD中指定attr類型時更改XJC生成的類名稱?

<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喜歡這種方式的人。 我想可能有辦法做到這一點與自定義綁定,但我還沒有找到如何。

任何幫助?

感謝, 米格爾

+0

你能分享你使用的最終命令行嗎? – 2012-01-11 16:50:11

回答

58

JAXB提供了兩種方法來實現:

1.聯架構Anntotations

您可以使用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 
+1

謝謝布萊斯。我無法更改xsd,因此必須使用外部綁定文件來完成。到目前爲止,我正在按照你的說法去做,但我希望更通用一些。也就是說,如果我有一個指向複雜類型的'type'元素,我可以管理編譯創建一個類,該名稱是元素的名稱而不是複雜類型的名稱? – 2011-01-27 08:14:52

13

好吧,我終於找到了如何去做。我的外部綁定文件是:

<?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

問候, 米格爾

1

這是我使用重命名複雜類型的外部約束力的文件。用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> 
相關問題