首页 > 解决方案 > 针对 XSD 架构验证 XML

问题描述

我有一个 XML 文件来验证 XSD 架构。这就是我的 XML 文件的样子。

<service>
  <id>myid</id>
  <name>myname</name>
  <arg>arg1</arg>
  <arg>arg2</arg>
</service>

这些是验证规则。

这是我为此创建的 XSD 文件。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="service">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">

        <xs:element type="xs:string" name="id" minOccurs="1" maxOccurs="1"/>
        <xs:element type="xs:string" name="name" minOccurs="1" maxOccurs="1"/>
        <xs:element type="xs:string" name="arg" minOccurs="1" maxOccurs="unbounded"/>

        </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我尝试使用此(https://www.freeformatter.com/xml-validator-xsd.html)在线验证器进行验证时,它可以工作。但即使有两个id元素或没有id元素,它现在也会显示任何错误。

<service>
  <id>myid</id>
  <id>anotherid</id>
  <name>myname</name>
  <arg>arg1</arg>
  <arg>arg2</arg>
</service>

这应该是错误的,因为有两个id元素。如何在元素中同时拥有可重复和不可重复的choice 元素。Sequence在这里是不可能的,因为顺序无关紧要。

<service>
  <name>myname</name>
  <arg>arg1</arg>
  <arg>arg2</arg>
</service>

这应该会失败,因为该id元素不存在。

标签: xmlxsdxsd-validationxml-validationxmlschema

解决方案


你必须做出选择。如果允许元素按任何顺序排列(使用 UnorderedSet),则不允许设置 maxOccurs > 1。如果使用重复选择,则无法验证出现次数,因为每次出现匹配一个标记的选择。但是如果你使用一个序列,你必须接受标签必须是正确的顺序。几乎每个人都接受了 XML 中对有序标签的需求——尽管这很不方便。


推荐阅读