尝试使用半序强制和可选元素序列验证XML架构时收到错误

尝试使用半序强制和可选元素序列验证XML架构时收到错误,xml,xsd,xml-parsing,Xml,Xsd,Xml Parsing,我在根据包含可选元素的嵌套序列的XSD验证XML时遇到问题。从3年前开始,情况类似,但不幸的是,这并不能解决我的问题。以XML为例: <root> <a>...</a> <b>...</b> <c>...</c> <b>...</b> <c>...</c> <d>...</d>

我在根据包含可选元素的嵌套序列的XSD验证XML时遇到问题。从3年前开始,情况类似,但不幸的是,这并不能解决我的问题。以XML为例:

<root>
    <a>...</a>

    <b>...</b>
    <c>...</c>

    <b>...</b>  
    <c>...</c>
    <d>...</d>
    <d>...</d>

    <b>...</b>
    <c>...</c>
    <d>...</d>

    <END>...</END>
</root>
但我遇到了这样的错误:

Error: cvc-complex-type.2.4.d: Invalid content was found starting with element 'd.10'. No child element is expected at this point.
其中d.10是类型d的最后一个子元素


我相信我没有正确地构造XSD——有人能建议一种替代方法吗

看起来您的代码是正确的,所以问题是您的输入文件。我接受了你的XSD并对其进行了修改,但保留了完整的结构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="a" type="aType"/>

                <xs:sequence minOccurs="1" maxOccurs="unbounded">
                    <xs:element name="b" type="aType"/>
                    <xs:element name="c" type="aType"/>
                    <xs:element name="d" minOccurs="0" maxOccurs="3" type="aType"/>
                </xs:sequence>

                <xs:element name="END" type="aType"/>

            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="aType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
使用以下XML(遵循您的解释中的逻辑),它将验证:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="xsd-choice-and%20occurrence.xsd">
    <a></a>
    <b></b>
    <c></c>
    <b></b>
    <c></c>
    <b></b>
    <c></c>
    <d></d>
    <d></d>
    <d></d>
    <b></b>
    <c></c>
    <d></d>
    <d></d>
    <d></d>
    <END></END>
</root>

数字d元素可以在0到3之间的任意位置。

我不确定您为什么会被否决,认为这与编程无关,因为您显然在询问代码的问题,并且您正在展示您所做的。谢谢Abel,您使用了什么方法/工具来验证XML?仅供参考,我没有发布整个输入XML,因为它太大了。但让我困惑的是,在生成错误的输入文件中,根本没有d节点。然而,错误消息却在抱怨d.10包含了不应该包含的内容!在成功地尝试了您的示例XSD和XML之后,我注意到我的大型输入XML没有正确地结束某些段。在任何情况下,最好知道这种验证可以通过模式来完成。使我的工作更容易:@rmbri:内部,但来自氧气,因为在那里很容易;。如果您在我给出的示例中遇到错误,则该错误是不正确的。但是您的原始代码与导致错误的代码不同。如果你想让我帮忙,做一个。@rmbri,我们是在同一时间发布的。很高兴你找到了!
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="a" type="aType"/>

                <xs:sequence minOccurs="1" maxOccurs="unbounded">
                    <xs:element name="b" type="aType"/>
                    <xs:element name="c" type="aType"/>
                    <xs:element name="d" minOccurs="0" maxOccurs="3" type="aType"/>
                </xs:sequence>

                <xs:element name="END" type="aType"/>

            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="aType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="xsd-choice-and%20occurrence.xsd">
    <a></a>
    <b></b>
    <c></c>
    <b></b>
    <c></c>
    <b></b>
    <c></c>
    <d></d>
    <d></d>
    <d></d>
    <b></b>
    <c></c>
    <d></d>
    <d></d>
    <d></d>
    <END></END>
</root>