JAXB错误,示例xsd文档

时间:2011-02-22 18:21:55

标签: xsd jaxb

运行“xjc -p foo.bar bmw.xsd”时出现JAXB错误:

[错误]已使用具有相同名称“foo.bar.Fault”的类/接口。   bmw.xsd第16行

[ERROR](与上述错误相关)从此处生成另一个。   abc.xsd第26行

它与两个'错误'元素冲突有关吗?如果是这样,我该怎么做才能解决?

bmw.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  elementFormDefault="qualified"    targetNamespace="http://foo.com/bmw" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bmw">
<xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/"  schemaLocation="abc.xsd"/>
<xs:element name="rule">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:customer"/>
    <xs:element ref="bmw:schemaName"/>
    <xs:element ref="bmw:schemaVersion"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="customer" type="xs:integer"/>
<xs:element name="schemaName" type="xs:NCName"/>
<xs:element name="schemaVersion" type="xs:decimal"/>
<xs:element name="fault">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:faultcode"/>
    <xs:element ref="bmw:faultstring"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="faultcode" type="xs:integer"/>
<xs:element name="faultstring" type="xs:string"/>
</xs:schema>

abc.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bbs">
<xs:import namespace="http://foo.com/bmw" schemaLocation="bmw.xsd"/>
<xs:element name="Envelope">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="env:Header"/>
    <xs:element ref="env:Body"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Header">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:rule"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Body">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="env:Fault"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Fault">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:fault"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

2 个答案:

答案 0 :(得分:2)

解决名称冲突时,您有几个选择。

选项#1 - 架构注释

您可以注释XML架构以解决名称冲突:

<xs:element name="Fault">
    <xs:annotation>
        <xs:appinfo>
            <jaxb:class name="Fault2" />
        </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="bmw:fault"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<强> abc.xsd

请参阅“Fault”元素上的模式注释。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bbs"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1">
    <xs:import namespace="http://foo.com/bmw" schemaLocation="bmw.xsd" />
    <xs:element name="Envelope">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="env:Header" />
                <xs:element ref="env:Body" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Header">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="bmw:rule"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Body">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="env:Fault" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Fault">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="Fault2" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="bmw:fault"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

选项#2 - 外部绑定文件

您也可以使用外部绑定文件而不是修改XML架构:

<强> bindings.xml

<jaxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jaxb:bindings schemaLocation="abc.xsd">
            <jaxb:bindings node="//xs:element[@name='Fault']">
                <jaxb:class name="Fault2"/>
            </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

xjc命令是:

xjc -d out -b bindings.xml abc.xsd

包名称

要控制包名称,您可以将其作为参数传递给XJC命​​令:

xjc -d out -b bindings.xml -p com.foo.bar abc.xsd

或修改绑定文件。

答案 1 :(得分:0)

是的,您的错误与冲突有关。您可以使用customized binding解决此问题。自定义绑定是一种告诉JAXB执行除自然操作之外的其他操作的方法。如果您不能自己注释XSD,请尝试查看外部绑定文件中的class标记。