XmlPullParser ... 因不整洁 HTML 而出现异常,如何使其更健壮?

XmlPullParser ... stumbles with an exception over untidy HTML, how to make it more robust?

来自独立提供商的 html 文件包含如下标签:

<link href="//abc...." rel="stylesheet" type="text/css">

因此,> 之前的最后一个 / 未编码。应该是“... />”。 我怎样才能避免解析器因这种不完善而产生异常?

我的代码是:

try {
    factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(false);
    // updated, as suggested below
    factory.setValidating(false);
    factory.setFeature(Xml.FEATURE_RELAXED, true); 
    factory.setNamespaceAware(true);
    parser = factory.newPullParser();
    parser.setInput(is);
    eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        String tagname = parser.getName();
        // etc. 

你不应该使用 XML 拉式解析器来解析不整洁的 HTML,它永远不能保证工作。

无论如何,我也对一个 HTML 基本正常的网站进行了实验,我注意到自 Android 以来的最新版本 KXmlParser(XMLPullParser 的底层实现)3比旧的更严格,他们有点忽略 FEATURE_RELAXED 标志。因此,如果您想要一个更宽容的 XMLPullParser,您可以将 KXmlParser 的 Gingerbread 版本直接复制到您的项目中,并使用它来代替框架的版本。

参见BladerCoder的第一条评论。谢谢你。

这回答了我的问题。

*

You need to configure the Factory entirely before you get the pull parser instance: the Factory uses its current configuration to create the instance

*

此外,只需处理源代码中偶尔出现的错误的异常就可以了。我无法影响源文件的(正确)创建。