我有一个模式,用于验证我的应用程序的HTTP请求。它对查询字符串和帖子内容非常有效,但我已经遇到了标题参数的绊脚石。理想情况下,我想检查HTTP_REQUEST_METHOD是'GET'还是'POST'等,但除此之外,我不关心其他参数的值。
所以,我的XML可能看起来像:
<REQUEST>
<HEADERS>
<User-Agent>bla bla</User-Agent>
<Cookie>bla bla</Cookie>
...
<request_method>GET</request_method>
...
<remote_port>bla bla</remote_port>
</HEADERS>
<QUERY_STRING>
...
</QUERY_STRING>
</REQUEST>
是否有任何方法可以为标题参数指定一个我不能预见的通配符,同时坚持认为如果有标记其内容是固定的?
这个有点:
<xsd:any namespace="##any" minOccurs="0" processContents="lax"/>
... fixed value of 'GET' for <request_method> ...
<xsd:any namespace="##any" minOccurs="0" processContents="lax"/>
这基本上是lax
的用途。它将验证它所知道的元素并忽略其他元素。你只需要用any
在你的内容模型中放一个maxOccurs=unbounded
,并定义像request_header
这样的已知参数作为全局元素。
唯一的问题是任何其他定义的全局元素如果在那里发生也将被验证。
示例模式:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="HEADERS">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="request_method">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="GET"/>
<xs:enumeration value="POST"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
如果您的验证器支持它,XML Schema 1.1中有更丰富的选项。