【问题标题】:Trouble shooting with Complextype复杂类型的故障排除
【发布时间】:2016-06-29 20:40:29
【问题描述】:

我有一个复杂类型-“A”,它使用扩展基-“基”后跟一系列元素。现在扩展 base-'Base' 本身就是复杂类型,并且在序列 ex.(元素 1、2、3)中有多个元素引用。我遇到的问题是,在尝试验证 XML 时,我得到的错误是元素“A”有无效的子“1”,它列出了 XML 上的其他可能元素。因为我在一个小组中工作,所以我只能对架构而不是 XML 进行更改。对不起,如果我解释它奇怪的例子将在下面

这是架构

<xsd:complexType name="A">
        <xsd:complexContent>
            <xsd:extension base="Base" >
                <xsd:sequence minOccurs="0" maxOccurs="unbounded">
                    <xsd:element name="B" minOccurs="0">
                        <xsd:complexType>
                            <xsd:complexContent>
                                <xsd:extension base="BData"/>
                            </xsd:complexContent>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="C" minOccurs="0">
                        <xsd:complexType>
                            <xsd:complexContent>
                                <xsd:extension base="CData"/>
                            </xsd:complexContent>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="D" minOccurs="0">
                        <xsd:complexType>
                            <xsd:complexContent>
                                <xsd:extension base="DData"/>
                            </xsd:complexContent>
                        </xsd:complexType>
                    </xsd:element>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

XML

<A>
  <D/>
  <B/>
  <C/>
  <T>     <---- This is the element from the base'Base' that gives me the error>
   <......>
  </T>
</A>

好的,所以在看到 cmets 之后,我将详细说明我的问题。这是我第一次发布问题,我面临的问题与我的工作有关,所以我无法发布具体细节。所以主要问题是'A'。所以我有我正在编辑的架构,它假设验证多个 XML。因此,我的目标是找到一种方法,让 Complextype A 使每个元素都有效,但同时如果从扩展名中调用一个元素,则无论顺序或次数如何,都不会弹出错误。我已经研究了“所有”元素,但问题是它只能发生 1 次。结论:序列无限次出现但顺序受限,全部无顺序限制但限于1次出现。这就像一个问题的兔子洞,欢迎任何解决方案。

【问题讨论】:

  • XML 元素名称不能以数字开头。
  • 您缺少一个结束 xsd:sequence 元素。
  • 您没有包含引用的Base 声明。
  • 你的格式一团糟。
  • 请阅读 How to Ask 并返回正确的 minimal reproducible example。谢谢。

标签: xml xsd


【解决方案1】:

在 XSD 1.0 中,所有复杂类型扩展都会创建一个序列,其第一个成员是基本类型中定义的复杂类型,第二个成员是扩展中给定的内容模型。对基本类型的消费者的保证是,如果他们阅读元素的开头,他们会在那里找到他们需要的东西,当他们开始看到他们没有准备好的孩子时,他们可以停止阅读。 (或者,更正式地说:在扩展类型 E 的任何有效实例 I 中,存在 I 的子序列的前缀,它对 E 的基本类型有效。)

在 XSD 1.1 中,还可以用另一个 all-group 扩展一个 all-group,从而得到(正如许多人所说的那样)一个更大的 all-group;不过,序列和选项的工作方式与 XSD 1.0 中的相同。

因此,您的实例的问题在于它在扩展允许的元素之后而不是之前具有基类型允许的元素。如果你希望它在你的类型 A 中是合法的,那么 A 和 Base 之间的关系不是类型扩展之一,你必须以其他方式定义它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2010-11-30
    • 2021-09-11
    • 2012-02-18
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多