Java DOCTYPE给出';意外';使用XmlPullParser时出错
下面是logcat出现的错误。它无法在任何xml文档的开头解析。我用一个没有DOCTYPE标签的页面尝试了我的程序,结果成功了。我已经使用setFeature来启用“FEATURE\u PROCESS\u DOCDECL”,但它并没有解决这个问题 错误: org.xmlpull.v1.XmlPullParserException:意外 我的代码摘录: URL=新URL(“”)Java DOCTYPE给出';意外';使用XmlPullParser时出错,java,android,Java,Android,下面是logcat出现的错误。它无法在任何xml文档的开头解析。我用一个没有DOCTYPE标签的页面尝试了我的程序,结果成功了。我已经使用setFeature来启用“FEATURE\u PROCESS\u DOCDECL”,但它并没有解决这个问题 错误: org.xmlpull.v1.XmlPullParserException:意外 我的代码摘录: URL=新URL(“”) 您正在解析HTML,就好像它是XML—它不是 您要么需要使用一个将HTML转换为XML的库,要么使用一个允许您访问您感兴
您正在解析HTML,就好像它是XML—它不是 您要么需要使用一个将HTML转换为XML的库,要么使用一个允许您访问您感兴趣的HTML DOM的任何部分的库,要么使用XML而不是HTML
(您还应该在抓取网站之前检查服务条款…DOCTYPE位于XML预处理器指令之后
<?xml version="1.0"?>
<!DOCTYPE ...>
这可能有点违反直觉。我也遇到过类似的问题。看起来XmlPullParser不接受小写的
,相反,它需要大写的版本
。(相关:)
这可以在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);
案例“!”:
开关(缓冲器[位置+2]){
案例“D”:
返回DOCDECL;//
我使用的解决方法是搜索特定的行和大写字母。但是developer.android.com上的XmlPullParser文档清楚地提到了DOCTYPE以及如何处理它。无论如何,我都会寻找一个库。谢谢!这可能与此无关,但有一个相似的外观:重用XmlPullParser会引发“意外令牌”关于DOCTYPE声明。
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);