首页 > 解决方案 > 不验证 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 ,:?.\\\-_=%+@&amp;!@#$%^*()\[\]+={}|\/:;,?`~'&quot;&lt;&gt;]*"/>
     </xs:restriction>
  </xs:simpleType>
</xs:schema>

echo1从上面的 XML 中,我不想 echo4 被验证,但所有其他元素都应该被验证。所以,基本上它应该允许任何值echo1echo4 但限制值echo2echo3匹配模式值。如何通过修改上述 XSD 来实现这一点?

标签: xmlxsdxsd-validationxml-validation

解决方案


如果您受限于 XSD 1.0,则需要更改您的 XML 设计或在 XSD 之外进行验证。如果您可以使用 XSD 1.1,那么条件类型分配将允许您基于 XSD 中的属性值表达宽松的验证约束,而无需更改您的 XML 设计。

也可以看看:


推荐阅读