0

当我试图描述我们用来制作 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 描述上述内容?

4

1 回答 1

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 不会指定它。或者只是不做这两个或都不做。)

于 2013-09-05T14:59:30.847 回答