如何在使用Sax解析错误的XML时忽略XML错误(在Android上)

如何在使用Sax解析错误的XML时忽略XML错误(在Android上),android,sax,saxparser,android-xml,saxparseexception,Android,Sax,Saxparser,Android Xml,Saxparseexception,关于Android上使用Java的SAXXML解析器的问题:我需要解析从web获得的XML文件,而我无法控制这些文件。其中一些包含错误,并导致解析器中止,出现诸如“标记不匹配”或“格式不正确(无效标记)”之类的错误 这些错误对我来说无关紧要,我想忽略它们并继续下去,我可以处理损坏的XML结构。但是我无法修复XML文件,它们不是我的。如何告诉Android上的Sax(类org.xml.Sax.XMLReader)不要抛出异常并继续运行?附加ErrorHandler不起作用,捕获异常也没有用,因为我

关于Android上使用Java的SAXXML解析器的问题:我需要解析从web获得的XML文件,而我无法控制这些文件。其中一些包含错误,并导致解析器中止,出现诸如“标记不匹配”或“格式不正确(无效标记)”之类的错误

这些错误对我来说无关紧要,我想忽略它们并继续下去,我可以处理损坏的XML结构。但是我无法修复XML文件,它们不是我的。如何告诉Android上的Sax(类org.xml.Sax.XMLReader)不要抛出异常并继续运行?附加ErrorHandler不起作用,捕获异常也没有用,因为我无法在异常停止的地方继续解析

我的XML不是HTML,但这里有一些(X)HTML示例,浏览器可以忽略错误并继续运行。我也想这么做

  • 浏览器可以使用“
    ”而不是“
    ”,即使标记从未关闭
  • 文本”“即使结束标记的顺序错误,也能正常工作
  • 零碎物品”被接受,尽管令牌无效,“零碎物品”是正确的
我不想编写自己的解析器,处理字符集转换等等。我不需要验证XML。以下是我的代码,简化为要点:

XMLReader r = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
r.setErrorHandler(new MyLenientErrorHandlerThatNeverThrows());
r.setContentHandler(new MyImporterThatExtendsDefaultHandler());
r.parse(new InputSource(new BufferedReader(...)));

谢谢

好的,似乎无法完成。Sax支持错误检测,但不支持错误恢复,这使得本例中的健壮代码不太理想。 通过使用XmlPullParser重放Sax使其工作,这允许在try-catch块中包装下一个令牌调用:

try {
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    XmlPullParser xpp = factory.newPullParser();
    xpp.setInput(in);
    int type = xpp.getEventType();
    while (type != XmlPullParser.END_DOCUMENT) {
        switch (type) {
          case XmlPullParser.START_TAG: startTag(xpp);             break;
          case XmlPullParser.END_TAG:   endTag(xpp);               break;
          case XmlPullParser.TEXT:      characters(xpp.getText()); break;
        }
        try {type = xpp.next();}
        catch (XmlPullParserException e) {}
    }
} catch (Exception e) {}