xml - 不验证 XSD 中的某些元素?
问题描述
我想使用下面的 XSD 来验证特定的 XML。同时,XSD 不应验证以下 XML 中的少数元素,但应验证其他元素。
例如,示例 XML 是:
<args src="body">
<arg name="echo1">£*138</arg>
<arg name="echo2">a-a$138</arg>
<arg name="echo3">b-b$136</arg>
<arg name="echo4">£*136</arg>
</args>
我使用的 XSD 是:
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="args">
<xs:complexType>
<xs:sequence>
<xs:element name="arg" maxOccurs="9" minOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="argFilter">
<xs:attribute name="name" use="required" type="codeEnumeration" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="src" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="url"/>
<xs:enumeration value="body"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:simpleType name="codeEnumeration">
<xs:restriction base="xs:string">
<xs:enumeration value="echo1"/>
<xs:enumeration value="echo2"/>
<xs:enumeration value="echo3"/>
<xs:enumeration value="echo4"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="argFilter">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="256"/>
<xs:pattern value="[a-zA-Z0-9 ,:?.\\\-_=%+@&!@#$%^*()\[\]+={}|\/:;,?`~'"<>]*"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
echo1
从上面的 XML 中,我不想 echo4
被验证,但所有其他元素都应该被验证。所以,基本上它应该允许任何值echo1
,echo4
但限制值echo2
和echo3
匹配模式值。如何通过修改上述 XSD 来实现这一点?
解决方案
如果您受限于 XSD 1.0,则需要更改您的 XML 设计或在 XSD 之外进行验证。如果您可以使用 XSD 1.1,那么条件类型分配将允许您基于 XSD 中的属性值表达宽松的验证约束,而无需更改您的 XML 设计。
也可以看看:
推荐阅读
- java - 是什么导致了这个 NullPointerException?
- python - 如何在张量流中对不同的图像类型使用不同的损失?
- python - 任务的气流回调
- php - “创建对象时出现类型错误:Magento\\Eav\\Model\\Entity\\Attribute\\Source\\Config”
- ios - 我们可以指定集合视图的每个部分中可以显示的行数吗
- crystal-reports - 水晶报表要求输入用户名和密码
- javascript - 如何在jQuery中获取文件是否上传
- node.js - 一个模块中有很多路线.exports
- python - Python2 在使用 sorted 时会引发异常,但 python3 不会
- javascript - 使用jquery单击后退按钮后输入字段没有被禁用