以下是logcat弹出的错误。它无法解析<!DOCTYPE ...>在任何xml文档的开头。我尝试了一个没有DOCTYPE标签的页面,并且它成功运行了。我已经使用setFeature来启用'FEATURE_PROCESS_DOCDECL',但它没有解决问题。
错误: org.xmlpull.v1.XmlPullParserException:意外<! (位置:START_DOCUMENT null @ 1:1 in java.io.InputStreamReader@424355f0)
我的代码摘录:
网址网址=新网址(“http://www.google.co.in/webhp?hl=en&tab=ww”);
XmlPullParserFactory parser = XmlPullParserFactory.newInstance();
parser.setNamespaceAware(true);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,true);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL,true);
XmlPullParser xpp = parser.newPullParser();
InputStream ip=url.openConnection().getInputStream();
xpp.setInput(ip, HTTP.UTF_8);
Message msg = mHandler.obtainMessage();
Bundle bundle = new Bundle();
int eventType=xpp.getEventType();
if(eventType==XmlPullParser.START_DOCUMENT){
while(eventType!=XmlPullParser.END_DOCUMENT ){
if(eventType!=XmlPullParser.DOCDECL){
eventType=xpp.nextToken();
}
else if(eventType==XmlPullParser.START_TAG){
if(xpp.getName().equalsIgnoreCase("title")){
bundle.putString("message", xpp.nextText());
msg.setData(bundle);
mHandler.sendMessage(msg);
eventType=xpp.nextToken();
}
}
}
}
答案 0 :(得分:0)
您正在解析HTML,就好像它是XML一样 - 但事实并非如此。
您需要使用将HTML转换为XML的库,或者使您可以访问您感兴趣的HTML DOM中的任何位,或者获取XML而不是HTML。
(您还应该在抓取网站之前检查服务条款......)
答案 1 :(得分:0)
DOCTYPE位于XML预处理器指令之后。
<?xml version="1.0"?>
<!DOCTYPE ...>
这可能有点违反直觉。
答案 2 :(得分:0)
我一直有类似的问题。看起来XmlPullParser不接受小写<!doctype html>
,而是期望大写的版本<!DOCTYPE html>
。 (相关:Uppercase or lowercase doctype?)。
可以在 org.kxml2.io.KXmlParser.java 找到:
/**
* Returns the type of the next token.
*/
private int peekType(boolean inDeclaration) throws IOException, XmlPullParserException {
从第1003行开始:
case '!':
switch (buffer[position + 2]) {
case 'D':
return DOCDECL; // <!D
case '[':
return CDSECT; // <![
case '-':
return COMMENT; // <!-
case 'E':
switch (buffer[position + 3]) {
case 'L':
return ELEMENTDECL; // <!EL
case 'N':
return ENTITYDECL; // <!EN
}
break;
case 'A':
return ATTLISTDECL; // <!A
case 'N':
return NOTATIONDECL; // <!N
}
throw new XmlPullParserException("Unexpected <!", this, null);
我使用的解决方法是搜索特定行和大写。