如何使用XmlPullParser从URL读取XML文件,AsyncTask Android

如何使用XmlPullParser从URL读取XML文件,AsyncTask Android,android,xml,android-asynctask,xmlpullparser,rss-reader,Android,Xml,Android Asynctask,Xmlpullparser,Rss Reader,我跟着 日志目录: 警告:org.xmlPull.v1.XmlPullParserException:应为:START_TAG{null}rss(位置:START_TAG@2:7 in java.io.InputStreamReader@41232f00) 错误:NullPoiterException 我正在寻找并使用一些基本的测试方法,但readRss方法中的parser.require不运行到rss标记 我想检索标题的内容,并将标签链接到项目中 我对我的英语能力感到抱歉,我对andro

我跟着

日志目录

警告:org.xmlPull.v1.XmlPullParserException:应为:START_TAG{null}rss(位置:START_TAG@2:7 in java.io.InputStreamReader@41232f00)
错误:NullPoiterException

我正在寻找并使用一些基本的测试方法,但readRss方法中的parser.require不运行到rss标记
我想检索标题的内容,并将标签链接到项目中
我对我的英语能力感到抱歉,我对android编程还不熟悉
非常感谢

来自url的xml内容

<rss xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">
  <channel>
    <title></title>
    <description></description>
    <pubDate></pubDate>
    <generator></generator>
    <link></link>

    <item>
      <title>CONTENTS</title>
      <link>http://test.html/</link>
    </item>

  </channel>
</rss>

目录
http://test.html/
XmlParser代码

public class XmlParser {

private static final String nameSpace = null;

public XmlParser(){

}

public List<Item> parse(InputStream inputStream)
        throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(inputStream, null);
        parser.nextTag();
        return readRss(parser);
    } finally {
        inputStream.close();
    }
}

private List<Item> readRss(XmlPullParser parser)
        throws XmlPullParserException, IOException {
    List<Item> itemList = new ArrayList<Item>();
    int eventType = parser.getEventType();

    System.out.println(parser.getName(); // <==== position is   html

    parser.require(XmlPullParser.START_TAG, nameSpace, "rss");  // <---- error
       /** Code in here is failed**/

    while (parser.next() != XmlPullParser.END_TAG) {
        if (eventType!= XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();

        // Starts by looking for the Rss tag
        if (name.equals("item")) {
                itemList.add(readItem(parser));
        } else {
            skip(parser);
        }
    }
    return itemList;
}

// This class represents a single entry (post) in the XML feed.
// It includes the data members "title," "link," and "summary."
public static class Item{
    String title = "";
    String link = "";

    private Item() {
    }
    private Item(String title){
        this.title = title;
    }

    private Item(String title, String link) {
        this.title = title;
        this.link = link;
    }
}

// Parses the contents of an item. If it encounters a title, link tag, hands
// them
// off
// to their respective &quot;read&quot; methods for processing. Otherwise,
// skips the tag.

private Item readItem(XmlPullParser parser) throws XmlPullParserException,
        IOException {
    parser.require(XmlPullParser.START_TAG, nameSpace, "item");
    String title = 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("link")) {
            link = readLink(parser);*/
        }else{
            skip(parser);
        }
    }
    return new Item(title);
    //return new Item(title, link);
}

// Skips tags the parser isn't interested in. Uses depth to handle nested tags. i.e.,
// if the next tag after a START_TAG isn't a matching END_TAG, it keeps going until it
// finds the matching END_TAG (as indicated by the value of "depth" being 0).

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

// Processes title tags in the Rss.
private String readTitle(XmlPullParser parser)
        throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, nameSpace, "title");
    String title = readTitle(parser);
    parser.require(XmlPullParser.END_TAG, nameSpace, "title");
    return title;
}

// Processes link tags in the Rss.
/*private String readLink(XmlPullParser parser)
        throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, nameSpace, "link");
    String link = readLink(parser);
    parser.require(XmlPullParser.END_TAG, nameSpace, "link");
    return link;
}
公共类XmlParser{
私有静态最终字符串名称空间=null;
公共XmlParser(){
}
公共列表解析(InputStream InputStream)
引发XmlPullParserException,IOException{
试一试{
XmlPullParser=Xml.newPullParser();
setFeature(XmlPullParser.FEATURE_进程_名称空间,false);
setInput(inputStream,null);
parser.nextTag();
返回readRss(解析器);
}最后{
inputStream.close();
}
}
私有列表阅读器(XmlPullParser)
引发XmlPullParserException,IOException{
List itemList=new ArrayList();
int eventType=parser.getEventType();

System.out.println(parser.getName();//您的Http请求并没有像您预期的那样返回rss,而是返回一个HTML页面,这就是您的解析失败的原因

归还的东西的剪报

<!DOCTYPE html>
<html><!-- InstanceBegin template="/Templates/common.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Vnexpress.net" />
<!-- iPad icons -->
<link rel="apple-touch-icon-precomposed" href="http://st.f1.vnecdn.net/responsive/images/logos/72x72.png" sizes="72x72">
<link rel="apple-touch-icon-precomposed" href="http://st.f1.vnecdn.net/responsive/images/logos/114x114.png" sizes="144x144">
<!-- iPhone and iPod touch icons -->
<link rel="apple-touch-icon-precomposed" href="http://st.f1.vnecdn.net/responsive/images/logos/57x57.png" sizes="57x57">
<link rel="apple-touch-icon-precomposed" href="http://st.f1.vnecdn.net/responsive/images/logos/114x114.png" sizes="114x114">
<!-- Nokia Symbian -->
<link rel="nokia-touch-icon" href="http://st.f1.vnecdn.net/responsive/images/logos/57x57.png">
<!-- Android icon precomposed so it takes precedence -->
<link rel="apple-touch-icon-precomposed" href="http://st.f1.vnecdn.net/responsive/images/logos/114x114.png" sizes="1x1">
<!-- InstanceBeginEditable name="doctitle" -->
<title>Tin nhanh VnExpress - Äá»c báo, tin tức online 24h</title>
<!-- InstanceEndEditable -->
<link rel="stylesheet" href="http://st.f3.vnecdn.net/responsive/c/v2/general.css" media="all" />
<!-- link rel="stylesheet" href="http://st.f3.vnecdn.net/responsive/css/iphone.css" media="all" / -->
<!-- InstanceBeginEditable name="css" -->
<!-- InstanceEndEditable -->
<script src="http://st.f4.vnecdn.net/responsive/libs/jquery-1.7.1.min.js"></script>
<script language="javascript" type="text/javascript">
         var interactions_url    = 'http://interactions.vnexpress.net';
         var base_url            = 'http://vnexpress.net';
         var css_url             = 'http://st.f3.vnecdn.net/responsive/c/v2';
         var js_url              = 'http://st.f2.vnecdn.net/responsive/j/v2';
         var flash_url           = 'http://st.f4.vnecdn.net/responsive/f/v2';
         var img_url             = 'http://st.f1.vnecdn.net/responsive/i/v2';
         var image_cloud         = 'http://l.f29.img.vnecdn.net';
         var PageHot             =  0;
         var device_env          =  2;
         var site_id             =  1000000;
         var SITE_ID             =  1000000;
         var PAGE_FOLDER         =  1001005;
         var PAGE_DETAIL         =  0         //setTypingMode(1);
      </script>
<script src="http://st.polyad.net/library/2014/VneShowAds.js"></script>
<script src="http://st.polyad.net/library/2014/vneads.js"></script>
<script type="text/javascript" src="http://st.f2.vnecdn.net/responsive/j/v2/utils/utils.js"></script>
<script type="text/javascript" src="http://st.f2.vnecdn.net/responsive/j/v2/utils/crawler.js"></script>

<script type="text/javascript" src="http://st.f2.vnecdn.net/responsive/j/v2/interactions/parser_v2.js"></script>
<script language="javascript" type="text/javascript">
         var PageHot             =  0;
         var site_id             =  1000000;
         var PAGE_FOLDER         =  1001005;
</script>

<!-- InstanceBeginEditable name="javascript" -->
<!-- InstanceEndEditable -->
<!-- TRACKING GOOGLE -->
        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
        //beta vnexpress reponsive
          ga('create', 'UA-249346-69', 'vnexpress.net');
          ga('send', 'pageview');
        //new tracker
          ga('create', 'UA-249346-21', 'auto', {'name': 'newTracker'});
          ga('newTracker.send', 'pageview');

        //new tracker 1
          ga('create', 'UA-249346-22', 'auto', {'name': 'newTracker1'});
          ga('newTracker1.send', 'pageview');
        </script>
      <script type="text/javascript">
         /*
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-249346-21']);
         _gaq.push(['_trackPageview']);

         _gaq.push(['b._setAccount', 'UA-249346-22']);
         _gaq.push(['b._trackPageview']);

         _gaq.push(['c._setAccount', 'UA-249346-1']);
         _gaq.push(['c._trackPageview']);
         <?php echo $this->ShowGaByCate($parent_category_id);?>

         (function() {
         var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
         ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
         var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
         })();
         */
      </script>
      <script>
        if(PAGE_FOLDER==1000000)
        {
            var _siteId="6";
            /// track cu trang chu//

               (function(){
                var e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src="http://st.l.a.eclick.vn/ea.js";
                var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();
         }else
         {
              var _siteId = "5";
              // track cu trang con //  
               (function(){
                var e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src="http://st.l.a.eclick.vn/ea.js";
                var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();
         }
        </script>
      <!-- END TRACKING GOOGLE -->
</head>

<body>
<div class="block_more_info" id="box_col_left" style="left: -240px;">
   <div class="box_width_common">
      <div class="btn_control_col_left"><img alt="" src="http://st.f1.vnecdn.net/responsive/i/v2/graphics/img_left_panel.gif"></div>
      <div class="block_scoll_menu">
         <div class="block_search">
            <form id="search" target="_blank" method="get" 
....
因此,我进一步调查发现,
httpserver
可能基于
用户代理来限制访问,下面的一行似乎可以解决这个问题

conn.setRequestProperty("User-Agent", "Fiddler");   
修复了这个问题,我相信这是一个很好的起点,可以帮助您继续并修复解析错误

结束编辑

GET /rss/du-lich.rss HTTP/1.1
Content-Type: application/rss+xml
User-Agent: Dalvik/2.0.0 (Linux; U; Android L Build/LPV81B)
Host: vnexpress.net
Connection: Keep-Alive
Accept-Encoding: gzip

HTTP/1.1 302 Moved Temporarily
Server: Fengine/1.5.2
Date: Fri, 10 Oct 2014 09:20:56 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Set-Cookie: device_env=1; expires=Fri, 17-Oct-2014 09:20:55 GMT; path=/; domain=vnexpress.net
Location: /error4.html
Content-Encoding: gzip
Vary: Accept-Encoding
server: web_141.173
conn.setRequestProperty("User-Agent", "Fiddler");