2013-07-20 43 views
3

下面是logcat彈出的錯誤。它無法解析任何xml文檔的開始處的<!DOCTYPE ...>。我嘗試了一個沒有DOCTYPE標記的頁面,它的工作成功。我已經使用setFeature來啓用'FEATURE_PROCESS_DOCDECL',但它不能解決問題。當使用XmlPullParser時,DOCTYPE給出'意外'錯誤

錯誤: org.xmlpull.v1.XmlPullParserException:意外的<! (位置:START_DOCUMENT空@ 1:1 [email protected]

我的代碼摘錄:

網址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(); 
          } 
          } 

        } 
         } 
+0

這可能是無關的,但有一個類似的[錯誤報告在這裏](https://code.google.com/p/android/issues/detail?id=182605):重用XmlPullParser引發「意外的令牌」 DOCTYPE聲明。 –

回答

0

您正在解析HTML,就好像它是XML - 事實並非如此。

您需要使用將HTML轉換爲XML的庫,或者需要使用庫來訪問您感興趣的HTML DOM的任何位,或者獲取XML而不是HTML。

(您也應該檢查服務條款刮網站之前,...)

+0

但是,developer.android.com上的XmlPullParser文檔清楚地提到了DOCTYPE以及如何解決它。無論如何,我會尋找一個圖書館。謝謝! – abishekshenoy

0

DOCTYPE自帶的XML預處理指令之後。

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

這可能有點違反直覺。

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

我所用的解決方法是,以搜索特定行和大寫。

相關問題