亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android Developers Training】 81. 解析XML

系統(tǒng) 2267 0

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛(ài)安卓而產(chǎn)生了翻譯的念頭,純屬個(gè)人興趣愛(ài)好。

原文鏈接: http://developer.android.com/training/basics/network-ops/xml.html


可擴(kuò)展標(biāo)記語(yǔ)言(XML)是一種將文檔編碼為機(jī)器可閱讀的形式的規(guī)則集合。XML是一種在互聯(lián)網(wǎng)中分享數(shù)據(jù)的比較流行的格式。那些頻繁更新內(nèi)容的網(wǎng)站(如新的站點(diǎn)或者博客),經(jīng)常會(huì)提供一個(gè)XML源,這樣外部程序就可以與內(nèi)容變更保持同步。上傳及解析XML數(shù)據(jù)對(duì)于需要聯(lián)網(wǎng)的應(yīng)用來(lái)說(shuō)是一個(gè)很平常的任務(wù)。這節(jié)課將講解如何解析XML文檔并使用它們的數(shù)據(jù)。


一). 選擇一個(gè)解析器

我們推薦使用 XmlPullParser ,它是一個(gè)在Android上解析XML的一種比較有效及穩(wěn)定的方法。歷史中Android有兩種實(shí)現(xiàn)該接口的方法:

每一種選擇都是可以的。不過(guò)這里我們使用第二個(gè)例子。 ?


二). 分析源

解析源的第一步是決定哪些字段是你感興趣的。解析器會(huì)提取這些你感興趣的字段數(shù)據(jù)并把其余的忽略。

下面是在應(yīng)用中被解析的源的一段摘錄。每一個(gè)到 StackOverflow.com 的推送都會(huì)在源中顯示為一個(gè) entry 標(biāo)簽,并 包含若干 entry 子標(biāo)簽:

      
        <?
      
      
        xml version="1.0" encoding="utf-8"
      
      
        ?>
      
      
        <
      
      
        feed 
      
      
        xmlns
      
      
        ="http://www.w3.org/2005/Atom"
      
      
         xmlns:creativeCommons
      
      
        ="http://backend.userland.com/creativeCommonsRssModule"
      
      
         ..."
      
      
        >
      
      
        <
      
      
        title 
      
      
        type
      
      
        ="text"
      
      
        >
      
      newest questions tagged android - Stack Overflow
      
        </
      
      
        title
      
      
        >
      
      
        

...

    
      
      
        <
      
      
        entry
      
      
        >
      
      
        

    ...

    
      
      
        </
      
      
        entry
      
      
        >
      
      
        <
      
      
        entry
      
      
        >
      
      
        <
      
      
        id
      
      
        >
      
      http://stackoverflow.com/q/9439999
      
        </
      
      
        id
      
      
        >
      
      
        <
      
      
        re:rank 
      
      
        scheme
      
      
        ="http://stackoverflow.com"
      
      
        >
      
      0
      
        </
      
      
        re:rank
      
      
        >
      
      
        <
      
      
        title 
      
      
        type
      
      
        ="text"
      
      
        >
      
      Where is my data file?
      
        </
      
      
        title
      
      
        >
      
      
        <
      
      
        category 
      
      
        scheme
      
      
        ="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags"
      
      
         term
      
      
        ="android"
      
      
        />
      
      
        <
      
      
        category 
      
      
        scheme
      
      
        ="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags"
      
      
         term
      
      
        ="file"
      
      
        />
      
      
        <
      
      
        author
      
      
        >
      
      
        <
      
      
        name
      
      
        >
      
      cliff2310
      
        </
      
      
        name
      
      
        >
      
      
        <
      
      
        uri
      
      
        >
      
      http://stackoverflow.com/users/1128925
      
        </
      
      
        uri
      
      
        >
      
      
        </
      
      
        author
      
      
        >
      
      
        <
      
      
        link 
      
      
        rel
      
      
        ="alternate"
      
      
         href
      
      
        ="http://stackoverflow.com/questions/9439999/where-is-my-data-file"
      
      
        />
      
      
        <
      
      
        published
      
      
        >
      
      2012-02-25T00:30:54Z
      
        </
      
      
        published
      
      
        >
      
      
        <
      
      
        updated
      
      
        >
      
      2012-02-25T00:30:54Z
      
        </
      
      
        updated
      
      
        >
      
      
        <
      
      
        summary 
      
      
        type
      
      
        ="html"
      
      
        >
      
      
        <
      
      
        p
      
      
        >
      
      I have an Application that requires a data file...
      
        </
      
      
        p
      
      
        >
      
      
        </
      
      
        summary
      
      
        >
      
      
        </
      
      
        entry
      
      
        >
      
      
        <
      
      
        entry
      
      
        >
      
      
        

    ...

    
      
      
        </
      
      
        entry
      
      
        >
      
      
        

...


      
      
        </
      
      
        feed
      
      
        >
      
    

應(yīng)用會(huì)提取會(huì)提取 entry 標(biāo)簽及其子標(biāo)簽: title , link summary 子標(biāo)簽的數(shù)據(jù)。


三). 初始化解析器

下一步是初始化解析器,并啟動(dòng)解析的步驟。在下面的代碼片段中,一個(gè)不處理命名空間的解析器被初始化,并使用 InputStream 作為參數(shù)。通過(guò)調(diào)用 nextTag() 開(kāi)始解析的步驟,并激活 readFeed() 方法,該方法提取并處理應(yīng)用感興趣的數(shù)據(jù):

      
        public
      
      
        class
      
      
         StackOverflowXmlParser {

    
      
      
        //
      
      
         We don't use namespaces
      
      
        private
      
      
        static
      
      
        final
      
       String ns = 
      
        null
      
      
        ;

   

    
      
      
        public
      
       List parse(InputStream in) 
      
        throws
      
      
         XmlPullParserException, IOException {

        
      
      
        try
      
      
         {

            XmlPullParser parser 
      
      =
      
         Xml.newPullParser();

            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, 
      
      
        false
      
      
        );

            parser.setInput(in, 
      
      
        null
      
      
        );

            parser.nextTag();

            
      
      
        return
      
      
         readFeed(parser);

        } 
      
      
        finally
      
      
         {

            in.close();

        }

    }

 ... 

}
      
    

四). 閱讀源

readFeed() 方法執(zhí)行一些工作來(lái)處理源。它尋找 entry 標(biāo)簽作為開(kāi)始遞歸處理的起始點(diǎn)。如果一個(gè)標(biāo)簽不是 entry 標(biāo)簽,那么就忽略它。一點(diǎn)整個(gè)源都被遞歸處理完了, readFeed() 方法返回一個(gè)包含它從源中提取的字段的 List (包含子數(shù)據(jù)成員)。該 List 被解析器返回。

      
        private
      
       List readFeed(XmlPullParser parser) 
      
        throws
      
      
         XmlPullParserException, IOException {

    List entries 
      
      = 
      
        new
      
      
         ArrayList();



    parser.require(XmlPullParser.START_TAG, ns, 
      
      "feed"
      
        );

    
      
      
        while
      
       (parser.next() !=
      
         XmlPullParser.END_TAG) {

        
      
      
        if
      
       (parser.getEventType() !=
      
         XmlPullParser.START_TAG) {

            
      
      
        continue
      
      
        ;

        }

        String name 
      
      =
      
         parser.getName();

        
      
      
        //
      
      
         Starts by looking for the entry tag
      
      
        if
      
       (name.equals("entry"
      
        )) {

            entries.add(readEntry(parser));

        } 
      
      
        else
      
      
         {

            skip(parser);

        }

    }  

    
      
      
        return
      
      
         entries;

}
      
    

五). 解析XML

解析一個(gè)XML源的步驟如下:

  1. 如第二節(jié)中所述,在你的應(yīng)用中標(biāo)識(shí)出你希望包含的標(biāo)簽。該例子中提取的數(shù)據(jù)為 entry 標(biāo)簽及其子標(biāo)簽: title , link summary 子標(biāo)簽的數(shù)據(jù)。
  2. 創(chuàng)建下列方法:
    • 為每個(gè)你感興趣的標(biāo)簽創(chuàng)建“ read ”方法。例如, readEntry(), readTitle()等。解析器從輸入流中讀取標(biāo)簽。當(dāng)它遇到了名為 entry, title, link或 summary時(shí),它會(huì)為標(biāo)簽調(diào)用相應(yīng)的方法。否則就略過(guò)該標(biāo)簽。
    • 為每個(gè)不同類(lèi)型標(biāo)簽提取數(shù)據(jù)并將解析器推進(jìn)到下一個(gè)標(biāo)簽的方法。例如:
      • 對(duì)于 title和 summary標(biāo)簽,解析器調(diào)用 readText()。該方法提取通過(guò)調(diào)用 parser.getText(),從這些標(biāo)簽中提取數(shù)據(jù)。
      • 對(duì)于 link標(biāo)簽,解析器首先確定該link是否是自己感興趣的,如果是的話就調(diào)用 parser.getAttributeValue()來(lái)提取它的值。
      • 對(duì)于 entry標(biāo)簽,解析器會(huì)調(diào)用 readEntry()。該方法解析entry中的子標(biāo)簽,并返回一個(gè) Entry 對(duì)象,其中包含了數(shù)據(jù)成員: title, link和 summary。
    • 一個(gè)用以輔助的方法 skip()。更多信息可以閱讀: Skip Tags You Don't Care About 。

下列代碼片段展示了如何解析上述標(biāo)簽:

      
        public
      
      
        static
      
      
        class
      
      
         Entry {

    
      
      
        public
      
      
        final
      
      
         String title;

    
      
      
        public
      
      
        final
      
      
         String link;

    
      
      
        public
      
      
        final
      
      
         String summary;



    
      
      
        private
      
      
         Entry(String title, String summary, String link) {

        
      
      
        this
      
      .title =
      
         title;

        
      
      
        this
      
      .summary =
      
         summary;

        
      
      
        this
      
      .link =
      
         link;

    }

}

  


      
      
        //
      
      
         Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them off


      
      
        //
      
      
         to their respective "read" methods for processing. Otherwise, skips the tag.
      
      
        private
      
       Entry readEntry(XmlPullParser parser) 
      
        throws
      
      
         XmlPullParserException, IOException {

    parser.require(XmlPullParser.START_TAG, ns, 
      
      "entry"
      
        );

    String title 
      
      = 
      
        null
      
      
        ;

    String summary 
      
      = 
      
        null
      
      
        ;

    String link 
      
      = 
      
        null
      
      
        ;

    
      
      
        while
      
       (parser.next() !=
      
         XmlPullParser.END_TAG) {

        
      
      
        if
      
       (parser.getEventType() !=
      
         XmlPullParser.START_TAG) {

            
      
      
        continue
      
      
        ;

        }

        String name 
      
      =
      
         parser.getName();

        
      
      
        if
      
       (name.equals("title"
      
        )) {

            title 
      
      =
      
         readTitle(parser);

        } 
      
      
        else
      
      
        if
      
       (name.equals("summary"
      
        )) {

            summary 
      
      =
      
         readSummary(parser);

        } 
      
      
        else
      
      
        if
      
       (name.equals("link"
      
        )) {

            link 
      
      =
      
         readLink(parser);

        } 
      
      
        else
      
      
         {

            skip(parser);

        }

    }

    
      
      
        return
      
      
        new
      
      
         Entry(title, summary, link);

}




      
      
        //
      
      
         Processes title tags in the feed.
      
      
        private
      
       String readTitle(XmlPullParser parser) 
      
        throws
      
      
         IOException, XmlPullParserException {

    parser.require(XmlPullParser.START_TAG, ns, 
      
      "title"
      
        );

    String title 
      
      =
      
         readText(parser);

    parser.require(XmlPullParser.END_TAG, ns, 
      
      "title"
      
        );

    
      
      
        return
      
      
         title;

}

  


      
      
        //
      
      
         Processes link tags in the feed.
      
      
        private
      
       String readLink(XmlPullParser parser) 
      
        throws
      
      
         IOException, XmlPullParserException {

    String link 
      
      = ""
      
        ;

    parser.require(XmlPullParser.START_TAG, ns, 
      
      "link"
      
        );

    String tag 
      
      =
      
         parser.getName();

    String relType 
      
      = parser.getAttributeValue(
      
        null
      
      , "rel"
      
        );  

    
      
      
        if
      
       (tag.equals("link"
      
        )) {

        
      
      
        if
      
       (relType.equals("alternate"
      
        )){

            link 
      
      = parser.getAttributeValue(
      
        null
      
      , "href"
      
        );

            parser.nextTag();

        } 

    }

    parser.require(XmlPullParser.END_TAG, ns, 
      
      "link"
      
        );

    
      
      
        return
      
      
         link;

}




      
      
        //
      
      
         Processes summary tags in the feed.
      
      
        private
      
       String readSummary(XmlPullParser parser) 
      
        throws
      
      
         IOException, XmlPullParserException {

    parser.require(XmlPullParser.START_TAG, ns, 
      
      "summary"
      
        );

    String summary 
      
      =
      
         readText(parser);

    parser.require(XmlPullParser.END_TAG, ns, 
      
      "summary"
      
        );

    
      
      
        return
      
      
         summary;

}




      
      
        //
      
      
         For the tags title and summary, extracts their text values.
      
      
        private
      
       String readText(XmlPullParser parser) 
      
        throws
      
      
         IOException, XmlPullParserException {

    String result 
      
      = ""
      
        ;

    
      
      
        if
      
       (parser.next() ==
      
         XmlPullParser.TEXT) {

        result 
      
      =
      
         parser.getText();

        parser.nextTag();

    }

    
      
      
        return
      
      
         result;

}

  ...

}
      
    

六). 跳過(guò)你不關(guān)注的標(biāo)簽

上面所描述的解析XML步驟中,其中有一步是解析器跳過(guò)我們不關(guān)注的標(biāo)簽。下面是skip()方法的代碼:

      
        private
      
      
        void
      
       skip(XmlPullParser parser) 
      
        throws
      
      
         XmlPullParserException, IOException {

    
      
      
        if
      
       (parser.getEventType() !=
      
         XmlPullParser.START_TAG) {

        
      
      
        throw
      
      
        new
      
      
         IllegalStateException();

    }

    
      
      
        int
      
       depth = 1
      
        ;

    
      
      
        while
      
       (depth != 0
      
        ) {

        
      
      
        switch
      
      
         (parser.next()) {

        
      
      
        case
      
      
         XmlPullParser.END_TAG:

            depth
      
      --
      
        ;

            
      
      
        break
      
      
        ;

        
      
      
        case
      
      
         XmlPullParser.START_TAG:

            depth
      
      ++
      
        ;

            
      
      
        break
      
      
        ;

        }

    }

 }
      
    

它為何這樣就能實(shí)現(xiàn)跳過(guò)的功能呢:

  • 如果當(dāng)前遇到的不是 START_TAG ,那么拋出一個(gè)異常。
  • 它接收 START_TAG ,以及之后遇到的內(nèi)容,并匹配 END_TAG 。
  • 為了確保它在正確的 END_TAG 停止,而不是在 START_TAG 之后遇到的第一個(gè)標(biāo)簽,它會(huì)一直向子標(biāo)簽深度搜索。

因此如果當(dāng)前標(biāo)簽含有子標(biāo)簽,那么depth的值不會(huì)變成0,直到解析器處理了所有在原始的 START_TAG 和與它匹配的 END_TAG 之間的所有標(biāo)簽。例如,考慮該解析器如何略過(guò)< author >標(biāo)簽,該標(biāo)簽含有兩個(gè)子標(biāo)簽 <name>和 <uri>:

  • 第一次while循環(huán),解析器在 <author>之后 遇到了 START_TAG: <name> ,此時(shí) depth的值增加到2。
  • 第二次while循環(huán),解析器遇到了 END_TAG: </name> 。此時(shí) depth的值減少到 1 。
  • 第三次while循環(huán),解析器遇到了 START_TAG: <uri> 。此時(shí) depth的值增加到2 。
  • 第四次while循環(huán),解析器遇到了END_TAG: </uri> 。此時(shí) depth 的值減少到 1 。
  • 最后一次while循環(huán),解析器遇到了 END_TAG: </author>。此時(shí)depth的值減少到0,表明 <author>已經(jīng)被成功忽略了。

七). 處理XML數(shù)據(jù)

樣例代碼中,使用了 AsyncTask 獲取并解析XML源。這樣該過(guò)程就不會(huì)再UI主線程中執(zhí)行。當(dāng)處理執(zhí)行完畢,應(yīng)用會(huì)更新主Activity( NetworkActivity )的UI。

在下面摘錄的代碼片段中, loadPage()方法進(jìn)行了如下的處理:

用XML源的URL初始化一個(gè)String變量。

在用戶的設(shè)置及網(wǎng)絡(luò)連接允許的情況下,調(diào)用 new DownloadXmlTask().execute(url)。這將初始化一個(gè)新的 DownloadXmlTask對(duì)象( AsyncTask 的子類(lèi))并運(yùn)行它的 execute() 方法,它會(huì)下載并解析源并將結(jié)果以String的形式返回,顯示在UI上。 ?

      
        public
      
      
        class
      
       NetworkActivity 
      
        extends
      
      
         Activity {

    
      
      
        public
      
      
        static
      
      
        final
      
       String WIFI = "Wi-Fi"
      
        ;

    
      
      
        public
      
      
        static
      
      
        final
      
       String ANY = "Any"
      
        ;

    
      
      
        private
      
      
        static
      
      
        final
      
       String URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest"
      
        ;

   

    
      
      
        //
      
      
         Whether there is a Wi-Fi connection.
      
      
        private
      
      
        static
      
      
        boolean
      
       wifiConnected = 
      
        false
      
      
        ; 

    
      
      
        //
      
      
         Whether there is a mobile connection.
      
      
        private
      
      
        static
      
      
        boolean
      
       mobileConnected = 
      
        false
      
      
        ;

    
      
      
        //
      
      
         Whether the display should be refreshed.
      
      
        public
      
      
        static
      
      
        boolean
      
       refreshDisplay = 
      
        true
      
      
        ; 

    
      
      
        public
      
      
        static
      
       String sPref = 
      
        null
      
      
        ;



    ...

      

    
      
      
        //
      
      
         Uses AsyncTask to download the XML feed from stackoverflow.com.
      
      
        public
      
      
        void
      
      
         loadPage() {  

      

        
      
      
        if
      
      ((sPref.equals(ANY)) && (wifiConnected ||
      
         mobileConnected)) {

            
      
      
        new
      
      
         DownloadXmlTask().execute(URL);

        }

        
      
      
        else
      
      
        if
      
       ((sPref.equals(WIFI)) &&
      
         (wifiConnected)) {

            
      
      
        new
      
      
         DownloadXmlTask().execute(URL);

        } 
      
      
        else
      
      
         {

            
      
      
        //
      
      
         show error
      
      
                }  

    }
      
    

AsyncTask 的子類(lèi):DownloadXmlTask如下所示,它實(shí)現(xiàn)了下列 AsyncTask 的方法:

doInBackground() 執(zhí)行 loadXmlFromNetwork(),它將源的URL作為參數(shù)傳入。 loadXmlFromNetwork()方法獲取并處理源。當(dāng)它結(jié)束以后,它會(huì)返回String作為結(jié)果。

onPostExecute() 接收結(jié)果String并將它顯示在UI上。

      
        //
      
      
         Implementation of AsyncTask used to download XML feed from stackoverflow.com.
      
      
        private
      
      
        class
      
       DownloadXmlTask 
      
        extends
      
       AsyncTask<String, Void, String>
      
         {

    @Override

    
      
      
        protected
      
      
         String doInBackground(String... urls) {

        
      
      
        try
      
      
         {

            
      
      
        return
      
       loadXmlFromNetwork(urls[0
      
        ]);

        } 
      
      
        catch
      
      
         (IOException e) {

            
      
      
        return
      
      
         getResources().getString(R.string.connection_error);

        } 
      
      
        catch
      
      
         (XmlPullParserException e) {

            
      
      
        return
      
      
         getResources().getString(R.string.xml_error);

        }

    }



    @Override

    
      
      
        protected
      
      
        void
      
      
         onPostExecute(String result) {  

        setContentView(R.layout.main);

        
      
      
        //
      
      
         Displays the HTML string in the UI via a WebView
      
      

        WebView myWebView =
      
         (WebView) findViewById(R.id.webview);

        myWebView.loadData(result, 
      
      "text/html", 
      
        null
      
      
        );

    }

}
      
    

下面是方法:loadXmlFromNetwork(),它被 DownloadXmlTask調(diào)用,它執(zhí)行下列任務(wù):

  • 初始化一個(gè) StackOverflowXmlParser,它也創(chuàng)建一個(gè)裝載entry對(duì)象的 List entries ),以及 title, url,和 summary,來(lái)存儲(chǔ)從XML源中相應(yīng)字段里提取出的數(shù)據(jù)。
  • 調(diào)用 downloadUrl(),它獲取源并以 InputStream 的形式返回
  • 使用 StackOverflowXmlParser來(lái)解析 InputStream StackOverflowXmlParser會(huì)用源中的數(shù)據(jù)填充 entries這個(gè) List 。
  • 處理 List ,并將源數(shù)據(jù)和HTML標(biāo)記向結(jié)合。
  • 返回 HTML字符串,由 AsyncTask onPostExecute() 方法將它 顯示在主Activity UI上的。
      
        //
      
      
         Uploads XML from stackoverflow.com, parses it, and combines it with


      
      
        //
      
      
         HTML markup. Returns HTML string.
      
      
        private
      
       String loadXmlFromNetwork(String urlString) 
      
        throws
      
      
         XmlPullParserException, IOException {

    InputStream stream 
      
      = 
      
        null
      
      
        ;

    
      
      
        //
      
      
         Instantiate the parser
      
      

    StackOverflowXmlParser stackOverflowXmlParser = 
      
        new
      
      
         StackOverflowXmlParser();

    List
      
      <Entry> entries = 
      
        null
      
      
        ;

    String title 
      
      = 
      
        null
      
      
        ;

    String url 
      
      = 
      
        null
      
      
        ;

    String summary 
      
      = 
      
        null
      
      
        ;

    Calendar rightNow 
      
      =
      
         Calendar.getInstance(); 

    DateFormat formatter 
      
      = 
      
        new
      
       SimpleDateFormat("MMM dd h:mmaa"
      
        );

        

    
      
      
        //
      
      
         Checks whether the user set the preference to include summary text
      
      

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(
      
        this
      
      
        );

    
      
      
        boolean
      
       pref = sharedPrefs.getBoolean("summaryPref", 
      
        false
      
      
        );

        

    StringBuilder htmlString 
      
      = 
      
        new
      
      
         StringBuilder();

    htmlString.append(
      
      "<h3>" + getResources().getString(R.string.page_title) + "</h3>"
      
        );

    htmlString.append(
      
      "<em>" + getResources().getString(R.string.updated) + " " +
      
         

            formatter.format(rightNow.getTime()) 
      
      + "</em>"
      
        );

        

    
      
      
        try
      
      
         {

        stream 
      
      =
      
         downloadUrl(urlString);        

        entries 
      
      =
      
         stackOverflowXmlParser.parse(stream);

    
      
      
        //
      
      
         Makes sure that the InputStream is closed after the app is

    
      
      
        //
      
      
         finished using it.
      
      

    } 
      
        finally
      
      
         {

        
      
      
        if
      
       (stream != 
      
        null
      
      
        ) {

            stream.close();

        } 

     }

    

    
      
      
        //
      
      
         StackOverflowXmlParser returns a List (called "entries") of Entry objects.

    
      
      
        //
      
      
         Each Entry object represents a single post in the XML feed.

    
      
      
        //
      
      
         This section processes the entries list to combine each entry with HTML markup.

    
      
      
        //
      
      
         Each entry is displayed in the UI as a link that optionally includes

    
      
      
        //
      
      
         a text summary.
      
      
        for
      
      
         (Entry entry : entries) {       

        htmlString.append(
      
      "<p><a href='"
      
        );

        htmlString.append(entry.link);

        htmlString.append(
      
      "'>" + entry.title + "</a></p>"
      
        );

        
      
      
        //
      
      
         If the user set the preference to include summary text,

        
      
      
        //
      
      
         adds it to the display.
      
      
        if
      
      
         (pref) {

            htmlString.append(entry.summary);

        }

    }

    
      
      
        return
      
      
         htmlString.toString();

}




      
      
        //
      
      
         Given a string representation of a URL, sets up a connection and gets


      
      
        //
      
      
         an input stream.
      
      
        private
      
       InputStream downloadUrl(String urlString) 
      
        throws
      
      
         IOException {

    URL url 
      
      = 
      
        new
      
      
         URL(urlString);

    HttpURLConnection conn 
      
      =
      
         (HttpURLConnection) url.openConnection();

    conn.setReadTimeout(
      
      10000 
      
        /*
      
      
         milliseconds 
      
      
        */
      
      
        );

    conn.setConnectTimeout(
      
      15000 
      
        /*
      
      
         milliseconds 
      
      
        */
      
      
        );

    conn.setRequestMethod(
      
      "GET"
      
        );

    conn.setDoInput(
      
      
        true
      
      
        );

    
      
      
        //
      
      
         Starts the query
      
      
            conn.connect();

    
      
      
        return
      
      
         conn.getInputStream();

}
      
    

【Android Developers Training】 81. 解析XML數(shù)據(jù)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久国产亚洲 | xxx中国毛茸茸 | 综合久 | 国产精品久久久久激情影院 | 亚洲一区二区三区在线视频 | 欧美福利在线 | 国产精品成人观看视频国产 | 簧片在线播放 | 欧美激情特级黄aa毛片 | 色人阁五月天 | 国产在线98福利播放视频免费 | 老司机午夜精品视频在线观看免费 | 在线亚洲免费 | 中文字幕在线观看国产 | 色综合天天综合网站中国 | 国产系列 视频二区 | 久久伊伊香蕉综合精品 | 天天操天天干天天透 | 伊人伊狠亚洲综合影院 | 久操这里只有精品 | 日韩免费一区二区三区 | 男人天堂欧美 | 久久99亚洲精品久久久久网站 | 中文字幕91| 久草首页在线 | 欧美日韩高清在线观看一区二区 | 亚洲国产综合网 | 四虎跳转48小时 | 四虎国产精品永久免费网址 | 亚洲欧美一区二区三区在线播放 | 四虎影视入口 | 亚洲精品mm1313久久 | 欧美色视频超清在线观看 | 亚洲最大在线视频 | 最近中文字幕无吗高清视频 | 欧美日韩国产一区二区三区播放 | 免费高清在线影片一区 | 日本一级毛一级毛片短视频 | 中文字幕久精品免费视频蜜桃视频 | 亚洲一区小说区中文字幕 | 久久亚洲热 |