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
*
此外,只需处理源代码中偶尔出现的错误的异常就可以了。我无法影响源文件的(正确)创建。
来自独立提供商的 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
*
此外,只需处理源代码中偶尔出现的错误的异常就可以了。我无法影响源文件的(正确)创建。