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