根据XSD模式验证XML

问题描述

我有一个XML文件可以针对XSD模式进行验证。这就是我的XML文件的样子。

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

这些是验证规则。

  • idname是唯一的并且是必需的。这些元素中不能有多个元素。
  • arg可以重复
  • 顺序无关紧要。元素可以是任意顺序。

这是我为此创建的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元素不存在。

解决方法

您必须做出选择。如果允许元素以任何顺序(使用UnorderedSet),则不允许设置maxOccurs>1。如果使用重复选择,则由于匹配一个 occurrence ,因此无法验证出现次数每次出现该选项时,>标记。但是,如果使用序列,则必须接受标签必须以正确的顺序排列。 几乎每个人都接受对XML中的有序标签的需求-即使这样做很不方便。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...