使用 Complextype 进行故障排除

Trouble shooting with Complextype

我有一个 complextype-'A',它使用扩展 base-'Base' 后跟一系列元素。现在扩展 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>

好的,在看到评论后,我将详细说明我的问题。这是我第一次 post 提出问题,我面临的问题与我的工作有关,所以我无法 post 具体细节。所以主要问题是 'A'。所以我有我正在编辑的架构,假设要验证多个 XML。因此,我的目标是为 Complextype A 找到一种方法,使每个元素都有效,但同时如果从扩展中调用元素,则无论顺序或次数如何,错误都不会弹出。我已经研究了 'all' 元素,但问题是它只能出现 1 次。结论:Sequence unlimited number of Occur but order restricted, All no order limitation but limited to 1 Occurrence.这就像一个问题的兔子洞,欢迎任何解决方案。

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

在 XSD 1.1 中,也可以用另一个 all-group 扩展一个 all-group 并得到更大的 [=17] 结果(正如许多人所说的那样) =];但是,序列和选择与 XSD 1.0.

中的工作方式相同

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