2010-11-15 93 views
2

我有一个xsd(让它命名为afb),它导入另一个xsd(让它命名为kts)。我指的是afb.xsd中的kts.xsd元素以及正确的名称空间。JAXB生成错误命名空间

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

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

因为验证我的XML对这个xsd失败也无法将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-复杂type.2.4.a:无效的含量被发现开始元素“KTS:结果”。期待“{”http://www.boschafb.com“:RESULTS}”之一。

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

问候,

萨蒂亚

回答

2

我与

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

assuing您abf.xsd始于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> 
+0

我不知道这是否解决了OP的问题,但它对我有用 - 我有一个导入架构的子元素,当它应该保留导入的名称空间时,它将取得父名称空间。从''改成''为我工作。谢谢! – 2011-07-15 14:24:58

0

尝试使用包括代替像这样导入:

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

这种风格会导致内部命名空间包括远不如问题。