【问题标题】:How to make two XSDs to use the same custom object如何使两个 XSD 使用相同的自定义对象
【发布时间】:2026-01-01 05:30:01
【问题描述】:

我正在使用 JAXB 和 intellij webservices 插件从 XSD 创建 java 文件。我有两个定义相同对象的 XSD,但是当我使用“从 XML 模式生成 java 代码”创建它们时,该对象是用他自己的包创建的两次。我已经尝试过 import xsd 并使用 ref 属性,我得到了相同的结果。

这是一个例子:

这是第一个 XSD

<?xml version="1.0" encoding="UTF-8"?>
   <xs:schema targetNamespace="http://www.msp-gs.com/workflow"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
       xmlns:wc="http://www.example.com/workflow"
       attributeFormDefault="unqualified"
       elementFormDefault="qualified"
       jaxb:version="1.0">

    <xs:annotation>
    <xs:appinfo>
        <jaxb:globalBindings enableJavaNamingConventions="true">

        </jaxb:globalBindings>
    </xs:appinfo>
    </xs:annotation>

    <xs:element name="WC">

    <xs:complexType>

        <xs:sequence>

            <xs:element name="Example"
                        type="wc:Restriction"
                        minOccurs="1"
                        maxOccurs="unbounded">

            </xs:element>

        </xs:sequence>

        </xs:complexType>

    </xs:element>

    <xs:complexType name="Restriction">

        <xs:attribute type="xs:string"
                  name="authorizationTreeId"/>

    </xs:complexType>

    </xs:schema>

这是第二个 XSD

    <?xml version="1.0" encoding="UTF-8"?>
     <xs:schema targetNamespace="http://www.msp-gs.com/workflow"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
       xmlns:fd="http://www.example.com/workflow"
       attributeFormDefault="unqualified"
       elementFormDefault="qualified"
       jaxb:version="1.0">

      <xs:annotation>
        <xs:appinfo>
        <jaxb:globalBindings enableJavaNamingConventions="true">

        </jaxb:globalBindings>
    </xs:appinfo>
      </xs:annotation>

    <xs:element name="FD">

        <xs:complexType>

        <xs:sequence>

            <xs:element name="Example"
                        type="fd:Restriction"
                        minOccurs="1"
                        maxOccurs="unbounded">

            </xs:element>

        </xs:sequence>

    </xs:complexType>

    </xs:element>

    <xs:complexType name="Restriction">

    <xs:attribute type="xs:string"
                  name="authorizationTreeId"/>

    </xs:complexType>

     </xs:schema>

我希望 Restriction 是同一个对象。

谢谢。

【问题讨论】:

  • 谢谢,我会马上进入并告诉你它是否有效。再次感谢您。
  • @Rotem:是什么阻止了您在这两种情况下都使用一个 XSD 文件?两个 XSD 的问题是您必须生成两次模型对象,但您可以为此使用相同的输出目录,因此第 2 次运行将覆盖第 1 次。或者您可以在模式生成后执行一些技巧(复制/清理)。
  • @dma_k:首先输出目录应该分开,因为有一个逻辑分离(苹果和橘子)。其次,我无法在生成后复制/清理,因为我还需要编组和解组那些生成的 java 文件,我不知道进程是否会受到这些操作的影响。
  • 你想杀死两只兔子:有不同的 XSD 和一些共同点。这是直接不可能的。如果西红柿是苹果和橙子的共同点,您可以将它们提取到单独的项目中,将模型生成到与橙子和苹果相同的包中,然后从橙子和苹果项目中删除西红柿(例如使用蚂蚁规则)。

标签: xsd jaxb


【解决方案1】:

您可以告诉 JAXB 使用现有的 Java 类,而不是使用外部绑定文件生成一个,如下所示。在下面的示例中,我们告诉 JAXB 使用现有的 Product 类:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb">
  <bindings scd="x-schema::tns"
    xmlns:tns="http://www.example.org/Product">
    <schemaBindings map="false"/>
    <bindings scd="tns:product">
      <class ref="org.example.product.Product"/>
    </bindings>
  </bindings>
</bindings>

如果您使用 XJC 工具从 XML 模式生成类,您可以使用 -episode 标志让 XJC 生成一个指向它生成的所有类的绑定文件。这将允许您重用以前生成的类。

xjc -d out -episode product.episode Product.xsd

更多信息

【讨论】:

  • 如果你使用 ant 任务,你可以像这样使用 episode 参数: