使用Complextype进行故障排除

时间:2016-06-29 20:40:29

标签: xml xsd

我有一个复杂的类型 - 'A',它使用了一个扩展库 - 'Base',后跟一系列元素。现在,扩展base-'Base'本身就是complextype,并且在序列ex(元素1,2,3)中有多个元素引用。我遇到的问题是,当我尝试验证XML时,我得到的错误是元素'A'具有无效的子'1',它列出了XML上的其他可能元素。我只能在组中工作时才能更改模式而不是XML。 Sry,如果我解释它,奇怪的例子将在下面

这是架构

<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>

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

1 个答案:

答案 0 :(得分:0)

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

在XSD 1.1中,也可以用另一个全组扩展一个全组,结果是(正如许多人所说的那样)一个更大的全组;但是,序列和选择的工作方式与XSD 1.0相同。

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