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

发布于 2024-10-13 15:33:10 字数 722 浏览 8 评论 0原文

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

有什么帮助吗?

谢谢, 米格尔

I'm a beginner to JAXB and I'm having annoying issues when generating Java classes with xjc. I am provided with a XSD like this:

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

and xjc is generating a class called ItemType.java, but I want the name to be Item.java. That is, I want the generated classes as if the XSD was like this:

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

There won't be any reuse of itemType on any other element, it's just the people that constructs the XSD likes it this way.
I guess there may be a way to do it with custom bindings but I still haven't found how.

Any help?

Thanks,
Miguel

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

薆情海 2024-10-20 15:33:10

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

JAXB provides two ways to accomplish this:

1. Inline Schema Anntotations

You can use JAXB schema annotations to control the class names.

<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. External Binding File

This customization can also be done via and external binding file:

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

The xjc command line would be:

xjc -d out -b binding.xml your-schema.xsd
就此别过 2024-10-20 15:33:10

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

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

问候,
米格尔

Well, I finally found how to do it. My external binding file is:

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

and xjc command must be executed with -extension option.

I found the solution in this page:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html (EDIT: obsolete link)

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

Regards,
Miguel

帅气尐潴 2024-10-20 15:33:10

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

This is the external binding file I use to rename a complextype. Compiles with cxf's 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文