XSD继承,扩​​展还是其他什么?

时间:2013-09-05 14:51:42

标签: xml xsd xsd-validation

当我试图描述我们用来制作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 个答案:

答案 0 :(得分: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不会指定它。或者只是不要同时执行或不执行。)