【问题标题】:xjc handle duplicated elemementsxjc 处理重复元素
【发布时间】:2014-08-04 12:14:12
【问题描述】:
  1. 我有三个 XSD 文件:a.xsd、b.xsd 和 c.xsd
  2. 它们中的每一个都包含一个名为MyHeader 的xs:element
  3. 我尝试使用xjc从这三个XSD文件生成java类
  4. 生成java文件时出错

这是所有三个 XSD 中的共同部分:

<xs:element name="MyHeader">
    <xs:complexType>
        <xs:attribute name="Username" type="xs:string" />
        <xs:attribute name="Password" type="xs:string" />
    </xs:complexType>
</xs:element>

错误信息是[xjc] [ERROR] 'MyHeader' is already defined

然后我尝试使用外部绑定来解决问题,因为我真的希望MyHeader可以是ONE java类。

我的外部绑定是这样的

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
    xsi:schemaLocation=" http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    version="2.1">
    <bindings schemaLocation="./a.xsd" node="/xs:schema">
        <bindings node="//xs:element[@name='MyHeader']">
            <class name="MyHeader" />
        </bindings>
    </bindings>

    <bindings schemaLocation="./b.xsd" node="/xs:schema">
        <bindings node="//xs:element[@name='MyHeader']">
            <class name="MyHeader" />
        </bindings>
    </bindings>

    <bindings schemaLocation="./c.xsd" node="/xs:schema">
        <bindings node="//xs:element[@name='MyHeader']">
            <class name="MyHeader" />
        </bindings>
    </bindings>
</bindings>

然后它抱怨xpath错误...

谁能帮我解决这个问题。谢谢。

【问题讨论】:

  • 是否有任何理由不将 MyHeader 中的 complexType 部分设为命名类型,甚至可能将其移至单独的 XSD 并导入到其他 XSD 中?
  • a.xsd、b.xsd 和 c.xsd 是否具有相同的命名空间?你能添加更多关于生成插件的信息吗?

标签: java xpath jaxb xsd xjc


【解决方案1】:

您的绑定文件需要命名空间前缀 xs: 的定义。添加后,在三个 xsd 文件之一中重命名 MyHeader 即可。

但是您将无法重命名三个不同 XML 模式文件中的三个冲突元素名称。

解决这个问题的一种方法是使用不同的命名空间:这样元素就不会发生冲突。

从两个架构文件中删除此元素的定义是另一种选择。

显然,整个架构设计存在缺陷,应重新考虑使用在一个文件中定义常见类型或元素的方法,而其他文件包括此公共基础文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多