2013-09-05 84 views
0

我正在將自己投入到XSD中,因爲我試圖描述用於製作RPC的工作中的(自定義)XML協議。XSD繼承,擴​​展或其他?

一個簡單的請求/響應對看起來像這樣:

<command type="request" lineid="500477"> 
    <request name="ping"> 
     <node id="503456" device="meter"/> 
    </request> 
</command> 


<command type="response" lineid="500477"> 
    <response name="ping"> 
     <result>true</result> 
    </response> 
</command> 

上面是下調例子,此外,所述請求節點可以包含參數元素的列表並把結果節點可以包含更高級的其他請求類型的數據。

我想用XSD來描述上面,但我似乎無法弄清楚如何描述請求/響應的動態性質。

我試圖擴展,繼承和嵌套xs:complexType,但似乎沒有什麼是「正確的方式」。

我當前的嘗試:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="request"> 
     <xs:attribute name="name" type="xs:string" use="required"/> 
    </xs:complexType> 
    <xs:complexType name="command" mixed="true"> 
     <xs:sequence> 
      <xs:element name="request" type="request"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="type" type="commandtype" use="required"/> 
     <xs:attribute name="lineid" type="xs:string"/> 
    </xs:complexType> 
    <xs:simpleType name="commandtype"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="request"/> 
      <xs:enumeration value="response"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="command" type="command" /> 
</xs:schema> 

即使在這個階段,我不知道如何讓這兩個請求和通用命令節點內響應元素。

我應該如何用XSD描述上述內容?

回答

1

在這一部分中,把請求和響應,但讓他們可選:

<xs:sequence> 
    <xs:element name="request" type="request" use="optional"></xs:element> 
    <xs:element name="response" type="request" use="optional"></xs:element> 
</xs:sequence> 

警告,我不擅長打字了從內存XSD,所以這可能不是完全正確,但原則是我想告訴你什麼。

通過這樣做,你可以有一個或另一個。 (或者你既可以兩者也可以既不可以,但是你可以將該測試添加到你的代碼中,並且XSD不會指定它,或者只是不這樣做或者兩者都不。)