如何创建需要某些元素的模式,允许其他元素,并且与顺序无关?

时间:2010-07-20 22:00:03

标签: xml xsd

我想创建一个包含以下内容的XML架构:

<xs:complexType name="Record">
        <!--required elements-->
        <xs:element name="RecordTag" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="RecordSize" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="RecordSection" type="xs:string" minOccurs="1" maxOccurs="1" />

        <!--optional elements-->
        <xs:element name="RecordName" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordType" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordValue" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordDefault" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordComment" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordURL" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="Condition" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="Master" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordCurrent" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordId" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:complexType>

正如您在评论中所说,我希望前三个元素是必需的,其余的是可选的。架构应该允许元素以任何顺序出现。

现在,如果我使用<xs:sequence>指标,则强制执行订单,这是我不想要的。 如果我使用<xs:all>指标,则架构要求显示所有元素,即使minOccurs值设置为0

我是否可以使用其他指标完成任务?

谢谢!

1 个答案:

答案 0 :(得分:1)

为了说明,我们假设下面的XSD;它与帖子中提供的没有什么不同,除了语法正确(通过引入xs:all compositor),并且为了便于创建示例XML,我还添加了一个虚拟Record元素。

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Record" type="Record"/>
    <xs:complexType name="Record">
        <xs:all>
            <!--required elements-->
            <xs:element name="RecordTag" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="RecordSize" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="RecordSection" type="xs:string" minOccurs="1" maxOccurs="1"/>

            <!--optional elements-->
            <xs:element name="RecordName" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordType" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordValue" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordDefault" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordComment" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordURL" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="Condition" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="Master" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordCurrent" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordId" type="xs:string" minOccurs="0" maxOccurs="1"/>          
        </xs:all>
    </xs:complexType>
</xs:schema>

拥有此示例XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RecordId>RecordId1</RecordId>
    <RecordCurrent>RecordCurrent1</RecordCurrent>
    <Master>Master1</Master>
    <Condition>Condition1</Condition>
    <RecordURL>RecordURL1</RecordURL>
    <RecordSection>RecordSection1</RecordSection>
    <RecordSize>RecordSize1</RecordSize>
    <!--
    <RecordTag>RecordTag1</RecordTag>
    -->
</Record>

有人会收到此错误消息(使用.NET时):

  

元素'Record'的内容不完整。可能的元素列表   预期:'RecordTag'。

Xerces会说:

  

cvc-complex-type.2.4.b:元素'Record'的内容不是   完成。预计会有一个'{RecordTag}'。

以上所有内容只是一个实际的论点,即问题中的原始陈述如下所示,是错误的。

  

如果我使用&lt; xs:all&gt;指标,然后架构需要所有   要出现的元素,即使minOccurs值设置为0。

此处提供的问题在XSD 1.0中通过all合成器完全可以实现。规范中没有任何内容表明其他情况;我冒昧地猜测,在XSD感知XML处理器中可能存在错误的实现。