使用XmlPullParser时,DOCTYPE会出现“意外”错误

时间:2013-07-20 11:36:17

标签: java android

以下是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();   
                            }
                            }

                  }
                      }

3 个答案:

答案 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);

我使用的解决方法是搜索特定行和大写。