如何在XML Schema定义中选择一个且仅一个元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在XML Schema定义中选择一个且仅一个元素相关的知识,希望对你有一定的参考价值。

道歉,如果之前有人询问,但我搜索了网站......

无论如何,我一直在努力研究如何在XML Schema中强制选择一个且只有一个元素。

例如,假设你只需要选择一种苹果,橙子或香蕉元素,但你不能没有苹果,橙子或香蕉元素。

现在我试过这个:

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://tempuri.org/Fruit"
            xmlns="http://tempuri.org/Fruit"
            elementFormDefault="qualified">

      <xsd:complexType mixed="true">
        <xsd:sequence>
            <xsd:choice minOccurs="0" maxOccurs="1">
              <xsd:element name="banana" type="xsd:string"/>
              <xsd:element name="apple" type="xsd:string"/>
              <xsd:element name="orange" type="xsd:string"/>
            </xsd:choice>
        </xsd:sequence>
      </xsd:complexType mixed="true">

</xsd:schema>

现在这很好,但<choice>不是唯一的,但实际上是零或只有一个。如何将基数强制为XML Schema Definition文件中的唯一一个?

答案

通过这种方式:

<xsd:choice minOccurs="1" maxOccurs="1">

修改后的架构:我添加了Fruit - root并将xsd更改为xs

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="Fruit">
      <xs:complexType  mixed="true">
        <xs:sequence>
            <xs:choice minOccurs="1" maxOccurs="1">
              <xs:element name="banana" type="xs:string"/>
              <xs:element name="apple" type="xs:string"/>
              <xs:element name="orange" type="xs:string"/>
            </xs:choice>
        </xs:sequence>
      </xs:complexType>
</xs:element>
</xs:schema>
另一答案

@smas的回答是正确的。但是,如果未在xs:choice(source)中显式声明,则minOccurs和maxOccurs属性都默认为1。所以你可以摆脱xs:choice上的属性并获得你想要的行为。

以上是关于如何在XML Schema定义中选择一个且仅一个元素的主要内容,如果未能解决你的问题,请参考以下文章

XML Schema:具有仅包含文本的属性的元素?

DTD && Schema

XML Schema - 如何定义包含字符串或子元素的元素

Spring面试高频题如何:自定义XML schema 扩展

如何使用 System.Xml.Schema 从 xs:choice 解析 xs:annotation

xml约束技术---schema