3

下面是 logcat 出现的错误。它无法解析任何 xml 文档开头的 <!DOCTYPE...>。我用一个没有 DOCTYPE 标签的页面尝试了我的程序,它成功地工作了。我已经使用 setFeature 来启用“FEATURE_PROCESS_DOCDECL”,但它并没有解决问题。

错误:org.xmlpull.v1.XmlPullParserException: Unexpected <! (位置:START_DOCUMENT null@1:1 在 java.io.InputStreamReader@424355f0 中)

我的代码摘录:

URL url = 新 URL(" 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();   
                            }
                            }

                  }
                      }
4

3 回答 3

1

我一直有类似的问题。看起来 XmlPullParser 不接受小写<!doctype html>,相反,它需要大写版本<!DOCTYPE html>。(相关:大写或小写文档类型?)。

这可以在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);

我使用的解决方法是搜索该特定行并将其大写。

于 2015-07-16T10:49:34.857 回答
0

DOCTYPE 出现在 XML 预处理器指令之后。

<?xml version="1.0"?>
<!DOCTYPE ...>

这可能有点违反直觉。

于 2013-07-20T12:11:53.930 回答
0

您正在解析 HTML,就好像它是 XML - 它不是。

您要么需要使用将 HTML 转换为 XML 的库,要么需要使用可让您访问您感兴趣的 HTML DOM 的任何位的库,或者获取 XML 而不是 HTML。

(您还应该在抓取网站之前检查服务条款......)

于 2013-07-20T11:38:44.943 回答