【问题标题】:How can I create a schema which requires certain elements, allows others, and is order-agnostic?如何创建需要某些元素、允许其他元素并且与顺序无关的模式?
【发布时间】:2010-07-20 22:00:02
【问题描述】:

我想创建一个包含以下内容的 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>

从 cmets 可以看出,我希望前三个元素是必需的,其余是可选的。架构应该允许元素以任何顺序出现。

现在,如果我使用&lt;xs:sequence&gt; 指示符,则会强制执行订单,这是我不想要的。 如果我使用&lt;xs:all&gt; 指示符,那么架构要求所有元素都出现,即使minOccurs 值设置为0

还有其他指标可以用来完成我的任务吗?

谢谢!

【问题讨论】:

  • 通常 应该满足您的需求。 CF:w3schools.com/schema/el_all.asp
  • 如果我使用 ,我该如何让它仍然需要前三个元素?
  • @Blue:你有没有得到答案?还是这不可能?
  • 我认为我没有得到答案(至少在这里),但如果我记得我想出了如何做我需要的事情。不幸的是,我不再在那家公司工作,所以我无法查找我的解决方案的来源!
  • @Blue 你没有使用 use="required" 属性吗?

标签: xml xsd


【解决方案1】:

为了说明,我们假设下面的 XSD;它与帖子中提供的没有什么不同,除了语法正确(通过引入 xs:all 合成器)并且为了轻松创建示例 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 时):

“记录”元素的内容不完整。可能的元素列表 预期:'RecordTag'。

Xerces 会说:

cvc-complex-type.2.4.b:元素“记录”的内容不是 完全的。应为“{RecordTag}”之一。

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

如果我使用 指示符,那么架构需要所有 即使 minOccurs 值设置为 0,也要显示元素。

这里提供的问题在 XSD 1.0 中通过all 合成器完全可以实现。规范中没有任何其他说明;我冒昧地猜测可能是 XSD 感知 XML 处理器中的错误实现。

【讨论】:

  • 那么,你有什么建议?我有完全一样的问题。什么是解决方法?
猜你喜欢
  • 2021-03-21
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多