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

关于
Android上的Sax XML解析器的问题,使用Java:我需要解析我从网上得到的XML文件,而且我无法控制.有些包含错误并导致解析器因“错配标记”或“格式不正确(无效标记)”之类的错误而中止.

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

我的XML不是HTML,但这里有一些(X)HTML示例,其中浏览器会忽略错误并继续运行.我也想这样做.

>浏览器很好用“< br>”而不是“< br />”即使标签永远不会关闭.
>“< b>< i> text< / b>< / i>”即使结束标签的顺序错误也能正常工作.
>尽管无效令牌仍然接受“赔率和结束”,“赔率和结果”将是正确的.

我宁愿不编写自己的解析器,处理字符集转换等等.我不需要验证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块中包装next-token调用:

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) {}
点赞