我有一个XML文件及其XSD架构。 我能够验证XML文件并实现自定义org.xml.sax.ErrorHandler,如下所示:
class MyErrorHandler implements ErrorHandler{
...
@Override
public void warning(SAXParseException exception) throws SAXException {
System.out.println("Line: " + exception.getLineNumber() + ") " + exception.getMessage() + exception);
warnings++;
}
...
}
是否可以实际操作导致异常的元素,例如将其从XML文件中删除?
两个注释:
此外,我们还希望了解为解决问题需要遵循的方向。谢谢!
答案 0 :(得分:4)
在一般情况下,无法自动修复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文档。