【问题标题】:How to validate XML elements with XSD schema?如何使用 XSD 模式验证 XML 元素?
【发布时间】:2018-02-09 01:41:18
【问题描述】:

我想在我的 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。但我想验证该值是否为整数并且该值是否为空。

也许是这样的:

如果(值 > 0 AND 值

我在谷歌上发现了一个关于断言的主题,所以我阅读了文档并做到了

<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>

【问题讨论】:

  • “值为空”是什么意思?您想接受什么样的 XML 而您设置的限制又不会接受?断言适用于未得到广泛支持的 XSD 1.1。您可能不想要它,即使它受到支持也不太可能对您有所帮助。
  • 好的,我修改了我的帖子,希望你能更好地理解。事实上,我需要使用 xml 验证器来检查我的所有文件

标签: xml xsd schema conditional-statements restrictions


【解决方案1】:

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

您将不得不选择类型 xs:string 并使用接受整数或空字符串的模式来限制它。

这可行:

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

正如它所说,您接受从 0 到 9 的数字,连续出现零次或多次。

如果你还需要它低于 100,我会让你找到一个强制这个附加条件的模式。

【讨论】:

  • 好的,我试过了,你的答案,但它也不起作用,我有这个错误res.xml:1029800: element valeur: Schemas validity error : Element 'valeur': '55' is not a valid value of the local atomic type.
  • 我认为您需要仔细检查您是否真的使用您认为的 XSD 验证了您认为的 XML。我尝试使用我的解决方案验证您的 XML 示例,并且它有效。
  • OHHH,非常抱歉,我忘了把开头放在图案的末尾
  • 我很抱歉再问一件事,但现在我想检查一个日期或什么都没有,我使用这个模式但他没有工作&lt;xs:pattern value="^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$"&gt;&lt;/xs:pattern&gt;我测试它并且它适用于 regex101。 com
  • 虽然我喜欢整数解决方案的简单性,但它不适用于像日期这样复杂的东西。为此,您需要遵循 @michael-kay 的解决方案。作为参考,^ 和 $ 在 XSD 模式验证中没有任何作用,因此不被接受。更确切地说,它们是按字面意思理解的,这不是您想要的。你只需要不放它们。但实际上,这里的模式并不是您想要的解决方案。
【解决方案2】:

我怀疑您的意思是该值必须是 0 到 100 之间的数字,或者是空字符串。如果是这样的话,你就会在 AND 和 OR 之间搞混了。

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

定义简单类型有两种常用方法,其中值必须为 X 或为空:

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

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

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

我个人更喜欢 (2):如果您使用模式感知查询和转换,效果会更好。但是,如果您只是使用架构进行验证,则没有区别。

【讨论】:

  • 感谢您的评论,我会考虑这一点,但因为我使用 python 脚本,也许我可以使用库 ElementTree 检查我的 xml 文件的所有值。你怎么看?
  • 我不知道 Python 或 ElementTree。
  • 好的,没问题,我会尝试做一个函数,因为我的XML文件包含超过1500000行
  • 您好,我的 XML 文件和 XSD 有一些问题,我需要验证该值是否介于 0 和 100 之间或为空。我在谷歌上搜索了如何工作的列表和工会,但我不是很明白,你能解释一下它是如何工作的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多