2010-03-11 76 views
2

我正在嘗試編寫一個XML架構來涵蓋我可能遇到的許多XML條件。我有不同的子元素相同的根元素(serviceRequest)。我試圖使用xs:擴展元素來定義多個版本,但它抱怨意外的元素orderInclusionCriteria等。用於具有多種結構的XML的XSD架構

我正在以正確的方式去做,還是有更好的方法來定義它?

我想過的另一種方式是在它內部有一個單一的xs:choice選項,但這看起來有點不雅。

這些XSD文件在XMLBeans中使用,如果有任何區別的話。

我已經給XML的以下2個例子:

1)

<?xml version="1.0" encoding="utf-8"?> 
<serviceRequest method="GOO" debug="NO"> 
    <sessionId sID="ABC1234567" /> 
    <orderInclusionCriteria accountId="1234567" accountNum="1234567890" /> 
</serviceRequest> 

2)

<?xml version="1.0" encoding="utf-8"?> 
<serviceRequest method="GOO" debug="NO"> 
    <sessionId sID="ABC1234567" /> 
    <action aType='MakePayment'> 
     <makePayment accountID='CH91015165S' amount='5.00' /> 
    </action> 
</serviceRequest> 

我以爲我可以使用下面的架構文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="serviceRequest" type="ServiceRequestType" /> 
    <xs:element name="session" type="SessionType" /> 

    <xs:attribute name="method" type="xs:string" /> 
    <xs:attribute name="debug" type="xs:string" /> 

    <xs:complexType name="SessionType"> 
     <xs:attribute name="sID" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"/> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 

    <xs:complexType name="ServiceRequestType"> 
     <xs:sequence> 
      <xs:element ref="session" /> 
     </xs:sequence> 
     <xs:attribute ref="method" /> 
     <xs:attribute ref="debug" />   
    </xs:complexType> 

    <xs:complexType name="OrderTrackingServiceRequest"> 
     <xs:complexContent> 
      <xs:extension base="ServiceRequestType"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="OrderInclusionCriteria" type="xs:string" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="Action"> 
     <xs:complexContent> 
      <xs:extension base="ServiceRequestType"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="makePayment"> 
          <xs:complexType> 
           <xs:attribute name="accountID" type="xs:string" /> 
           <xs:attribute name="amount" type="xs:string" /> 
          <xs:complexType> 
         </xs:element> 
        </xs:sequence> 
        <xs:attribute name="aType" type="xs:string" /> 
       </xs:complexType> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

回答

0

嘗試對不想出現的元素使用minOccurs =「0」。我想用這種方式你可以用版本解決你的問題。另外xs:choice可以在你的情況下工作