【问题标题】:how to ignore XML errors when parsing faulty XML with Sax (on Android)使用 Sax 解析错误 XML 时如何忽略 XML 错误(在 Android 上)
【发布时间】:2012-03-12 16:37:08
【问题描述】:

关于 Android 上使用 Java 的 Sax XML 解析器的问题:我需要解析从 Web 获取的 XML 文件,而我无法控制。有些包含错误并导致解析器中止并出现“不匹配标签”或“格式不正确(无效令牌)”等错误。

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

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

  • 浏览器可以使用“
    ”而不是“
    ”,即使标签从未关闭。
  • text ”即使结束标签的顺序错误也能正常工作。
  • odds & ends”被接受,尽管令牌无效,“odds & ends”是正确的。

我宁愿不编写自己的解析器,处理字符集转换等等。我不需要验证 XML。这是我的代码,简化为基本内容:

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

谢谢!

【问题讨论】:

    标签: android sax saxparser android-xml saxparseexception


    【解决方案1】:

    好的,看来无法完成。 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) {}
    

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2011-04-30
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多