如何在XSD中定义具有可选和必需元素的组?

时间:2014-01-14 18:53:59

标签: xml xsd

这是XML:

<employee>
  <name>John Doe</name> <!-- exactly one mandatory element -->
  <age>35</age> <!-- exactly one mandatory element -->
  <manager/> <!-- optional element, can be absent -->
</employee>

我正在尝试在XSD中定义它:

<xs:complexType name="employee">
  <xs:all>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="age" type="xs:string"/>
    <xs:element name="manager" minOccurs="0"/>
  </xs:all>
</xsl:complexType>

验证者在manager元素缺席时会抱怨。我做错了什么?

可能与Middle way between XSD all and XSD sequence

有关

这是我验证的方式:https://github.com/jcabi/jcabi-xml/blob/jcabi-0.7.5/src/main/java/com/jcabi/xml/XSDDocument.java#L161-L207

1 个答案:

答案 0 :(得分:1)

密钥可能是您正在使用的验证器,和/或您正在获得的确切错误。

如果我使用这个XSD(与你的很相似,除了一些小的清理和使用全局元素来匹配你的实例XML):

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="employee">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="name" type="xsd:string"/>
                <xsd:element name="age" type="xsd:string"/>
                <xsd:element name="manager" minOccurs="0"/>
            </xsd:all>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

然后像这样的XML是完全有效的(注意我已经注释掉了manager元素):

<employee>
  <name>John Doe</name> <!-- exactly one mandatory element -->
  <age>35</age> <!-- exactly one mandatory element -->

    <!--
  <manager/> 
    -->
    <!-- optional element, can be absent -->
</employee>

重新添加manager元素,XML仍然有效(根据minOccurs = 0)。

回到我的开场评论......你必须说出你正在使用的验证器...上面的内容适用于.NET和Java(库存Xerces) - 正如他们应该的那样。