2010-03-11 84 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可以在你的情况下工作