问题描述
我有一个来自第三方的 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 重新测试。