xjc处理重复元素

时间:2014-08-04 12:14:13

标签: java xpath jaxb xsd xjc

  1. 我有三个XSD文件:a.xsd,b.xsd和c.xsd
  2. 每个都包含一个名为MyHeader
  3. 的xs:元素
  4. 我尝试使用xjc从这三个XSD文件生成java类
  5. 生成java文件时出错
  6. 以下是所有三个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可以是一个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错误......

    有人可以帮助我摆脱这个问题。感谢。

1 个答案:

答案 0 :(得分:2)

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

但您无法在三个不同的XML架构文件中重命名三个冲突元素名称。

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

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

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