在一般情况下,无法自动修复 XML 文档。
只有在非常有限的情况下,使 XML 文档有效所需的修复才能与任何给定的验证错误自动区分。验证错误与补救方法之间没有一对一的映射关系。
考虑r
带有a
直通e
子元素的元素:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="r">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="a"/>
<xsd:element name="b"/>
<xsd:element name="c"/>
<xsd:element name="d"/>
<xsd:element name="e"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
像这样的一个 XML 文档,
<r>
<a/>
<x/>
<b/>
<c/>
<d/>
<e/>
</r>
Xerces-J 会产生如下验证消息:
[错误] try.xml:5:7: cvc-complex-type.2.4.a: 发现以元素“x”开头的无效内容。预期为“{b}”之一。
您可能会在这里自动删除x
,一切都会好起来的。(或者,您可能会插入一个b
,这不会很好。)
然而,对于同一个 XSD,考虑这个 XML 文档,
<r>
<a/>
<c/>
<d/>
<e/>
</r>
Xerces-J 会产生如下验证消息:
[错误] try.xml:5:7: cvc-complex-type.2.4.a: 发现以元素“c”开头的无效内容。预期为“{b}”之一。
如果您自动删除c
,您的文档仍然无效,并且您会收到一条关于d
意外的类似消息。这将一直持续到您的文档看起来像这样,
<r>
<a/>
</r>
此时您的错误消息将返回原始消息,
[错误] try.xml:5:5: cvc-complex-type.2.4.b: 元素“r”的内容不完整。预期为“{b}”之一。
如您所见,在给定的验证错误中没有足够的信息来了解如何修复一般的 XML 文档。
您可以通过咨询 XSD 做得更好,但这非常复杂,并且仍然不能保证唯一地确定创作者或系统所犯的确切错误。在一般情况下,即使给定 XSD,也无法自动修复 XML 文档。