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

标签 android sax saxparser android-xml saxparseexception

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

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

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

  • 浏览器可以使用“
    ”而不是“
    ”,即使标签从未关闭。
  • text ”即使结束标记的顺序错误也能正常工作。
  • 尽管 token 无效,“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(...)));

谢谢!

最佳答案

好吧,看来做不到了。 Sax 支持错误检测但不支持错误恢复,这使得它不太适合本示例中的健壮代码。 通过使用 XmlPullParser 重新替换 Sax 使其工作,这允许将 next-token 调用包装在 try-catch block 中:

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

关于android - 使用 Sax 解析错误的 XML 时如何忽略 XML 错误(在 Android 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393298/

相关文章:

java - 让 ValueListener 只发生一次

java - 不允许实体声明但允许 DTD

java - XML 架构 : using attribute definition in complexType

java - SAXParser 不从 URL 检索 XML 数据

java - 不推荐使用 Activity 类型的方法 managedQuery(Uri, String[], String, String[], String)

android - 在 Google Map Android 中设置更新位置的时间

android - 我想了解文件在 SFTP 服务器上的位置

java - 从指定行开始读取 Excel 工作表

java - 如何使用 XML (SAXParser) 中的元素并将其显示到表中

java - 从 servlet 到达 xml