繁体   English   中英

如何使用XSD模式验证XML元素?

[英]How to validate XML elements with XSD schema?

我想在XSD模式中为XML文档使用条件。

我使用了限制,但功能并不强大。

这是我到目前为止所做的一个示例:

<xs:element name="Matricule">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="valeur">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minInclusive value="0"></xs:minInclusive>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element type="xs:string" name="backgroundcolor"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>

此示例工作正常,但我只是检查该值是否大于0。但是我想验证该值是否为Integer以及该值为空。

也许是这样的:

如果(值> 0 AND值<100 AND值='')

我在Google上发现了一个需要断言的主题,因此我阅读了文档,然后做到了

<xs:element name="Matricule">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="valeur">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minInclusive value="0"></xs:minInclusive>
                            **<xs:assertion test="($value mod 10) = 0"/>**
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element type="xs:string" name="backgroundcolor"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>

但这不起作用,我总是有一个错误。

例1的值:

<racine>
  <row>
    <Matricule>
      <valeur>55</valeur>
      <backgroundcolor></backgroundcolor>
    </Matricule>
  </row>
</racine> 

示例2无值:

<racine>
  <row>
    <Matricule>
      <valeur></valeur>
      <backgroundcolor></backgroundcolor>
    </Matricule>
  </row>
</racine>

这两个例子必须正确,但是这个没有:

<racine>
  <row>
    <Matricule>
      <valeur>gfd</valeur>
      <backgroundcolor></backgroundcolor>
    </Matricule>
  </row>
</racine>

我怀疑您的意思是该值必须为0到100之间的数字,或者为空字符串。 如果真是这样,您将在AND和OR之间陷入混乱。

空字符串不是xs:integer的有效实例,因此您不能将此类型定义为xs:integer的限制(因为限制只能定义为基值空间的子集的值空间)。

有两种常见的方法来定义一个简单类型,其中值必须为X或为空:

  1. 定义一个成员类型为X的联合类型,以及一个从xs:string派生的类型,其唯一允许的值为“”

  2. 定义一个列表类型,其项类型为X,maxOccurs为1。

(在这种情况下,X是xs:integer的限制,其中minInclusive = 0,maxInclusive = 100)。

我个人更喜欢(2):如果您使用的是模式感知型查询和转换,它会更好。 但是,如果您仅使用模式进行验证,则没有任何区别。

如果您需要接受空元素,则它们的内容不是整数类型,因为空字符串不代表数字。

您将不得不选择xs:string类型,并仅使用接受整数或空字符串的模式对其进行限制。

这将工作:

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]*"/>
  </xs:restriction>
</xs:simpleType>

如您所接受,它是0到9之间的数字,连续零次或更多次。

如果您的要求也低于100,我将让您找到一种强制执行此附加条件的模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM