2014-10-08 90 views
2

我有一個關於JAXB和繼承有以下要求的問題:如何正確處理繼承的JAXB

  • XSD第一
  • 我們使用org.jvnet.jaxb2.maven2生成XSD代碼:Maven的JAXB2 -plugin
  • XML驗證應該工作

這是我的基地XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     targetNamespace="http://api.mijathi.be/msg/schema/vehicle" 
     xmlns="http://api.mijathi.be/msg/schema/vehicle" 
     elementFormDefault="qualified" 
     attributeFormDefault="unqualified"> 

<xs:element name="vehicles"> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="1"> 
      <xs:element ref="vehicleType" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="vehicleType" type="vehicleType"/> 

<xs:complexType name="vehicleType" abstract="true"> 
    <xs:sequence/> 
</xs:complexType> 
</xs:schema> 

現在的實現:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     targetNamespace="http://api.mijathi.be/msg/schema/vehicle" 
     xmlns="http://api.mijathi.be/msg/schema/vehicle" 
     elementFormDefault="qualified" 
     attributeFormDefault="unqualified"> 

<xs:include schemaLocation="http://api.mijathi.be/msg/schema/vehicle/main.xsd"/> 

<xs:element name="car" type="carDescription" substitutionGroup="vehicleType"/> 

<xs:complexType name="carDescription"> 
    <xs:complexContent> 
     <xs:extension base="vehicleType"> 
      <xs:sequence> 
       <xs:element name="make" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 

</xs:complexType> 
</xs:schema> 

類的產生很好的成功。我甚至可以很好地解組使用此示例XML:

<veh:vehicles xmlns:veh="http://api.mijathi.be/msg/schema/vehicle"> 
<veh:vehicleType xsi:type="veh:car" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <veh:make>string</veh:make> 
</veh:vehicleType> 
</veh:vehicles> 

但是外部,使用IDE例如,當然XML驗證這一塊失敗。因爲veg命名空間中沒有定義「car」:

<veh:vehicleType xsi:type="veh:car" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <veh:make>string</veh:make> 
</veh:vehicleType> 

我該如何解決這個問題?

回答

1

很少至極的事情可能會有所幫助:

  • 如果你有不同的模式,可以考慮使用的xs:import代替xs:include。否則它基本上變成了「一個」模式,我不認爲這是你的意圖。
  • 使用xsi:schemaLocation在你的XML,在這裏看到: what is the use of xsi:schemaLocation?
  • 在Eclipse中,您使用一個命名空間URI可以添加自己的XML架構在首選項> XML目錄,例如。

要驗證,Eclipse需要訪問您的模式。它應該如何知道從哪裏得到它?那麼,要麼是xsi:schemaLocation要麼是中央目錄。

+0

實際上,xsd在intellij中註冊得很好。車輛類型的xsi:類型僅部分驗證失敗。我會檢查您提供的進口提示,但我想知道替代組將如何應對......。 – 2014-10-08 21:14:14