当我试图描述我们用来制作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描述上述内容?
答案 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不会指定它。或者只是不要同时执行或不执行。)