Java DOCTYPE给出';意外';使用XmlPullParser时出错

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的库,要么使用一个允许您访问您感兴

下面是logcat出现的错误。它无法在任何xml文档的开头解析。我用一个没有DOCTYPE标签的页面尝试了我的程序,结果成功了。我已经使用setFeature来启用“FEATURE\u PROCESS\u DOCDECL”,但它并没有解决这个问题

错误: org.xmlpull.v1.XmlPullParserException:意外 我的代码摘录:

URL=新URL(“”)


您正在解析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);