如何删除无效的XML元素

时间:2016-12-05 12:54:24

标签: java xml xsd javax

我有一个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文件中删除?

两个注释:

  • XML操作不需要就地,即我可以生成一个删除了失败元素的新文件;
  • 最好是能够获得导致异常的父元素,以便我可以决定是否完全删除父元素。

此外,我们还希望了解为解决问题需要遵循的方向。谢谢!

1 个答案:

答案 0 :(得分:4)

在一般情况下,无法自动修复XML文档。

在非常有限的上下文中,使XML文档有效所需的修复可以从任何给定的验证错误中自动识别。验证错误与补救方法之间没有一对一的映射。

考虑ra个孩子的元素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文档。