JAXB生成错误的命名空间

时间:2010-11-15 15:51:12

标签: jaxb

我有一个xsd(让它命名为afb),它导入另一个xsd(让我们将其命名为kts)。我在afb.xsd中引用了kts.xsd的元素以及正确的名称空间。

但是当我使用JAXB生成类时,引用元素的命名空间是错误的。

我的意思是,被引用的元素应该具有kts名称空间,因为它具有afb名称空间。

因此,根据此xsd验证我的XML失败也无法将xml数据绑定到java模型中。

EX: afb.xsd:

<xs:import namespace="http://www.boschkts.com" schemaLocation="kts.xsd"/>
<xs:element name="vehicle">

<xs:complexType>
        <xs:sequence>
          <xs:element ref="vType"/>
          <xs:element name="RESULTS" type="kts:RESULTS" >
        </xs:sequence>
    </xs:complexType>
</xs:element>

kts:xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschkts.com" 
targetNamespace="http://www.boschkts.com" elementFormDefault="qualified">

<xs:complexType name="RESULTS">
    <xs:sequence>
        <xs:element name="SUMMARY" type="SUMMARY" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

Vehicle.java:

public class Vehicle {

    @XmlElement(namespace = "http://www.boschafb.com", required = true)
    protected String vType;
    @XmlElement(name = "RESULTS", namespace = "http://www.boschafb.com", required = true)
    protected Results results;

}

如果我观察到Vehicle.java,结果属性的名称空间应该是“http://www.bosch kts .com”而不是“http://www.boschafb.com” “

如果我手动更改命名空间,那么将数据从xml绑定到java模型就可以了。 但仍然验证xsd失败并出现错误:

  

引起:org.xml.sax.SAXParseException:cvc-complex-type.2.4.a:找到以元素'kts:RESULTS'开头的无效内容。其中一个'{“http://www.boschafb.com”:结果}'是预期的。

任何人都可以指出我在xsd中可能缺少的内容吗?或者它是jaxb生成的方式,我必须手动修改类?

此致

萨蒂亚

2 个答案:

答案 0 :(得分:2)

我正在考虑你的abf.xsd开始

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschafb.com"
           targetNamespace="http://www.boschafb.com" elementFormDefault="qualified">

elementFormDefault设置为qualified,所有元素声明(甚至是嵌套的声明)都属于指定的目标命名空间。请注意,这仅适用于元素,引用的类型不会影响引用它的元素的名称空间。

解决方案是在'kts.xsd'中定义元素而不是类型,并在第一个模式中引用此元素:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschkts.com" 
           targetNamespace="http://www.boschkts.com" elementFormDefault="qualified">
    <xs:element name="RESULTS">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SUMMARY" type="SUMMARY" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschafb.com"
           targetNamespace="http://www.boschafb.com" elementFormDefault="qualified"
           xmlns:kts="http://www.boschkts.com">

    <xs:import namespace="http://www.boschkts.com" schemaLocation="kts.xsd"/>

    <xs:element name="vehicle">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="vType"/>
                <xs:element ref="kts:RESULT"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

答案 1 :(得分:0)

尝试使用include而不是像这样导入:

<xs:include schemaLocation="kts.xsd"/>代替<xs:import namespace="http://www.boschkts.com" schemaLocation="kts.xsd"/>

此样式导致命名空间内包含的问题要少得多。