2014-08-27 61 views
1

我已經定義了許多其他模式中常用的類型模式。重複使用不含子類型的XML模式元素/類型

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://www.exampleURI.com/MyTypes" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mytypes="http://www.exampleURI.com/MyTypes"> 
    <xs:complexType name="Order"> 
     <xs:sequence> 
      <xs:element name="Customer" type="mytypes:Customer" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="Date" type="xs:date" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="Products" type="mytypes:Products" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="Total" type="xs:decimal" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Product"> 
     <xs:sequence> 
      <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="Variation" type="mytypes:Variation" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Variation"> 
     <xs:sequence> 
      <xs:element name="Color" type="xs:string" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Customer"> 
     <xs:sequence> 
      <xs:element name="Discount" type="xs:int" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Products"> 
     <xs:sequence> 
      <xs:element name="Product" type="mytypes:Product" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

通常我想重用這些類型,但不是所有的ComplexType子元素。例如以下OrderList響應必須包含訂單客戶數據,但而不是產品數據。當我從前面的模式引用Order類型時,它將包括Order及其所有子元素。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://www.exampleURI.com/OrderList" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:s1="http://www.exampleURI.com/OrderList" xmlns:mytypes="http://www.exampleURI.com/MyTypes"> 
    <xs:import namespace="http://www.exampleURI.com/MyTypes" schemaLocation="types.xsd"/> 
    <xs:element name="OrderListResponse" type="s1:OrderListResponse"/> 
    <xs:complexType name="ResponseData"> 
     <xs:sequence> 
      <xs:element name="id" type="xs:long" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Orders"> 
     <xs:sequence> 
      <xs:element name="Order" type="mytypes:Order" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="OrderListResponse"> 
     <xs:sequence> 
      <xs:element name="Orders" type="s1:Orders" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="Responsedata" type="s1:ResponseData" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

我的目標:

  • 定義OrderListResponse這樣只有SimpleType的元素下順序返回。
  • 將Order.Customer ComplexType添加到響應中。
  • 當我對MyTypes模式(例如新的可選元素)進行向後兼容的更改時,只有它們是SimpleTypes(字符串,日期等)時,它們才應包含在OrderListResponse中。

是否有任何形式的patter來實現這些目標,或者我應該簡單地將MyTypes模式類型複製粘貼到所有其他模式並刪除不需要的子元素?

回答

2

如果我正確理解您的問題,裝飾模式聽起來像它會滿足您的需求,您可以使用擴展元素在XML中實現。首先定義包含將被共享的簡單元素的OrderSimple類型。然後創建一個OrderComplex類型來擴展OrderSimple,以添加您定義的複雜元素。當然,你可以根據需要命名這些。例如:

<xs:complexType name="OrderSimple"> 
    <xs:sequence> 
     <xs:element name="Date" type="xs:date" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="Total" type="xs:decimal" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="OrderComplex"> 
    <xs:complexContent> 
     <xs:extension base="OrderSimple"> 
      <xs:sequence> 
       <xs:element name="Customer" type="mytypes:Customer" minOccurs="1" maxOccurs="1"/> 
       <xs:element name="Products" type="mytypes:Products" minOccurs="1" maxOccurs="1"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

然後,您只需引用適用於您正在構建的響應的類型即可。

另一種方法可能是簡單地設置complexTypes的屬性,以便它們在響應中可以爲空,具體取決於您希望響應對象的「純」級別。

+0

哇,非常感謝!我知道必須有一個簡單的方法來做到這一點。 – Indrek 2014-08-27 22:17:37

相關問題