SQL Server XML 架构验证;无效内容错误;期望 minoccurs 设置为 0 的元素?

问题描述

我有一个来自第三方的 XSD,我试图用它在 sql Server 中创建 XML 架构集合并验证从该第三方收到的 XML。

验证后,我收到一个错误

XML 验证:无效内容。预期元素:'element1'、'element2'。找到:元素 'element3' 代替。位置:/DOCUMENT[1]/:reference_data[1]/:element3[1]。

相关的 XSD 和 XML 在我看来是正确的,但我无法确定发生此错误的原因。这里是相关的 XSD 修剪回相关元素(整个文档很大,所以我不会在这里发布):

<xs:element name="reference_data">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="element1" minOccurs="0" maxOccurs="256">
                <xs:complexType>
                    <xs:simpleContent>
                        ... some other stuff
                    </xs:simpleContent>
                </xs:complexType>
           </xs:element>
           <xs:element name="element2" minOccurs="0" maxOccurs="50">
               <xs:complexType>
                   <xs:simpleContent>
                       ... some other stuff
                   </xs:simpleContent>
               </xs:complexType>
           </xs:element>
           <xs:choice minOccurs="0" maxOccurs="1000">
               <xs:element name="element3" minOccurs="0" maxOccurs="1000">
               </xs:element>
           </xs:choice>
       </xs:sequence>
   </xs:complexType>
</xs:element>

这是正在验证的相关 XML:

<reference_data>
    <element1>ABCD</element1>
    <element3>
        <associated_detail1>whatever</associated_detail1>
        <associated_detail2>whatever</associated_detail2>
    </element3>
</reference_data>

如您所见,element1 在那里,所以我不明白为什么它找到 element3 而不是 element1。 Element2 不存在,但它也在 XSD 中定义为 minoccurs=0,那么为什么它是“预期的”?

解决方法

XSD 验证器发出不正确的验证错误是不常见的 - 特别是如果 XML 处理器是频繁使用的处理器之一(例如 Java VM 附带的处理器)。

但是,如果您的 XSD 和 XML 与发布的完全一样,那么我同意您的评估。看到第一次出现 .woff2 后,允许的“下一个标签名称”集为 (/reference_data/element1,element1,element2)。

Filburt 关于 element3 下意外子元素的评论是正确的,但这应该会产生不同的 XSD 验证错误(与 element3 的内容有关)

我建议您使用您发布的确切 XSD 和 XML 重新测试。