旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

挪用API生成RSS资本文件的实例详解【XML教程】,API,生成RSS

作者:搜教程发布时间:2019-12-01分类:XML教程浏览:70评论:0


导读:C#挪用新浪微博API生成RSS资本文件(源文件Demo)新浪微博如今彷佛势头很猛,许多人在竖立自身的微博客的时刻,最先出于猎奇,都邑追随许多人,一朝一夕,自身的挚友人数凌驾...

C#挪用新浪微博API生成RSS资本文件(源文件Demo)

新浪微博如今彷佛势头很猛,许多人在竖立自身的微博客的时刻,最先出于猎奇,都邑追随许多人,一朝一夕,自身的挚友人数凌驾100后,那末你就发明,你已完整淹没在信息的激流中了,你追随了那末多人,许多人都是以后可以永久都不会想起,也永久也不会看到的人,这明显与“关注”的目标是相背的,更有时刻可以你只是想看下你熟悉的人的音讯更新了没有,然则明显你不可以每次都一个个到自身的关注人物表中点开然后再逐一接见他的主页,如许操纵太烦琐了。

用过RSS阅读器的用户可以都体会到RSS阅读器在猎取信息的优越性了吧。它能及时跟踪RSS资本的更新,并显现更新数量到指定的定阅资本背面,可以让用户有针对性地检察信息,让用户主动地去猎取信息,而不再是被动地接收信息了,这关于处理微博的“信息激流”题目是很有用的。

笔者花费了几天时候,终究写了一个顺序,用于猎取指定用户的挚友,并存储备份到ACCESS数据库中,然后生成一个RSS阅读资本。不敢独享,所以开源和人人分享。以后假如有时候,我想再将它做成一个桌面软件,轻易平常不懂顺序的用户来操纵,这都是后话了吧。

1. 新浪微博RSS定阅第三方网站

新浪微博自身没有供应RSS定阅,然则到网上搜刮,发明了一个第三方的网站,供应新浪微博的RSS资本,所以,本文的RSS定阅说白了都是基于这个第三方网站的。

log.medcl.net/item/2010/02/sina-bo-rss-subscribe-feed-generate-micro/

2. 网上通用的OPML文件的XML花样

下面是从Google Reader中导出的opml文件,这是收集RSS阅读器以至一切RSS阅读器的规范花样吧,最少“鲜果”,“有道”这些比较盛行的在线阅读器都支撑这个花样的文件导入。

<?xml version="1.0" encoding="UTF-8"?><opml version="1.0">
	<head>
		<title>subscriptions</title>
		<dateCreated>2010-05-16 15:45:03</dateCreated>
		<ownerName></ownerName>
	</head>
	<body>
		<outline text="微博客" title="微博客">			
			<outline text="冷笑话(1567852087)" 
				title="冷笑话(1567852087)" type="rss"
				htmlUrl="http://t.sina.com.cn/1567852087" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1567852087" />
			<outline text="后宫文雅(1665289110)" 
				title="后宫文雅(1665289110)" type="rss"
				htmlUrl="http://t.sina.com.cn/1665289110" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1665289110" />
			<outline text="围脖经典语录" 
				title="围脖经典语录" type="rss"
				htmlUrl="http://t.sina.com.cn/1646465281" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1646465281" />			
			<outline text="破阵子(1644022141)" 
				title="破阵子(1644022141)" type="rss"
				htmlUrl="http://t.sina.com.cn/1644022141" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1644022141" />			
		</outline>
		<outline text="珞珈山水" title="珞珈山水">			
			<outline text="本日十大热门话题" 
				title="本日十大热门话题" type="rss"
				htmlUrl="http://bbs.whu.edu.cn/frames.html" 
				xmlUrl="http://bbs.whu.edu.cn/rssi.php?h=1" />			
			<outline text="贴图版" 
				title="贴图版" type="rss"
				htmlUrl="http://bbs.whu.edu.cn/wForum/board.php?name=Picture" 
				xmlUrl="http://bbs.whu.edu.cn/wForum/rss.php?board=Picture&amp;ic=1" />
		</outline>
	</body></opml>

剖析OPML文件的架构,然后轻易经由历程顺序来将它须要的信息写成此架构的文件,便于阅读器援用。 OPML文件由头部标签<head>(主如果本文件的一些解释,不影响现实的RSS定阅信息,不是太重要)和<body>(RSS阅读器提取定阅资本的悉数数据泉源)。在<body>节点下面有个一级的<outline>节点,这个节点对应RSS阅读器中地RSS资本的分类文件夹相干信息(明显text示意的就是文件夹称号),然后一级<outline>下面就是二级的<outline>标签对,这内里就是RSS资本的相干数据内容了。二级<outline>中的节点的一些重要属性:text示意资本的题目,htmlUrl示意的是信息的的Web网页地点,xmlUrl示意的是信息的RSS定阅地点。

3. 新浪微博API――从服务器上导出用户挚友数据到当地XML文件

关于新浪微博API的细致引见,可以参考新浪微博API官方网站:

open.t.sina.com.cn/wiki/index.php/首页

关于身份认证和数据要求,请参考cnblogs:

《.NET挪用新浪微博开放平台接口的代码示例》

www.cnblogs.com/cmt/archive/2010/05/13/1733904.html

下面是自身整顿的代码,从服务器上要求用户的挚友信息:

private void getFriends()
        {            int previous_cursor=-1;            int next_cursor = -1;            while (next_cursor != 0)
            {                string cursor = Convert.ToString(previous_cursor);                string url = " http://api.t.sina.com.cn/statuses/friends.xml?source=AppKey&cursor=" + cursor;                string username = "dreamzsm@gmail.com";                string password = name; //这里输入你自身微博登录的的暗码
                //注重这里的花样哦,为 "username:password"

                System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);
                System.Net.HttpWebRequest myReq = webRequest as System.Net.HttpWebRequest;                //身份验证
                string usernamePassword = username + ":" + password;
                CredentialCache mycache = new CredentialCache();
                mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password));
                myReq.Credentials = mycache;
                myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

                WebResponse wr = myReq.GetResponse();
                Stream receiveStream = wr.GetResponseStream();
                StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);                string content = reader.ReadToEnd();


                XmlDocument xmlDoc = new XmlDocument();

                xmlDoc.LoadXml(content);                // xmlDoc.Load("data1.xml");

                XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//猎取根节点的一切子节点

                next_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText);
                previous_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count-1).InnerText);                string xmlName = "friends_" + nodeList.Item(nodeList.Count - 1).InnerText + "_" + Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText) + ".xml";
                previous_cursor = next_cursor;

                xmlDoc.Save(xmlName);

            }
        }


为了顺序设计简朴一点,笔者就有点偷懒了,没有细致研讨怎样将一切的数据写到一个XML文件中,而是每次要求获得的20条数据写成一个XML文件,末了我159个挚友,根据指定的定名要领生成了8个XML文件。

云云,就获得了一切的你的挚友(就是你追随的人)的信息了,以单工资例,其重要信息以下:

<user>
    <id>1710993410</id>
    <screen_name>某丫大人</screen_name>
    <name>某丫大人</name>
    <province>43</province>
    <city>1</city>
    <location>湖南 长沙</location>
    <description>饭否儿,心朝饭否,春暖花开。 我照样@饿YA 我还真是懒得引见了。</description>
    <url>http://1</url>
    <profile_image_url>http://tp3.sinaimg.cn/1710993410/50/1273755892</profile_image_url>
    <domain>
    </domain>
    <gender>f</gender>
    <followers_count>168</followers_count>
    <friends_count>79</friends_count>
    <statuses_count>846</statuses_count>
    <favourites_count>0</favourites_count>
    <created_at>Sun Mar 14 00:00:00 +0800 2010</created_at>
    <following>false</following>
    <verified>false</verified>
    <allow_all_act_msg>false</allow_all_act_msg>
    <geo_enabled>false</geo_enabled>
    <status>
      <created_at>Sun May 16 21:02:44 +0800 2010</created_at>
      <id>364379114</id>
      <text>烦死了快、</text>
      <source>
        <a href="">新浪微博</a>
      </source>
      <favorited>false</favorited>
      <truncated>false</truncated>
      <geo />
      <in_reply_to_status_id>
      </in_reply_to_status_id>
      <in_reply_to_user_id>
      </in_reply_to_user_id>
      <in_reply_to_screen_name>
      </in_reply_to_screen_name>
    </status>
  </user>

可以看到这内里的信息量是超等多的,我简朴引见下几个重要的节点吧

id

用户新浪微博的数字ID,就像你的QQ号一样

name

用户昵称

province

省代号

city

市代号

location

地点省市(彷佛和上面两个节点反复了)

description

自我形貌

domain

域名,就是除了数字ID后,用户请求的修正域名

gender

性别。男的是Male,女的是Female.

followers_count

粉丝数

friends_count

追随的人数

statuses_count

宣布的状况也就是微博数

favourites_count

珍藏微博数量吧?(不知道这个有什么用)

created_at

用户竖立此微博客的时候

verified

是不是经由新浪的VIP认证

status

用户近来的一次状况

除了user信息外,另有一些别的信息,比方根节点下的next_cursor和previous_cousor,这轻易用户分屡次到服务器上要求数据时可以此作为定位根据。

<next_cursor>20</next_cursor>

<previous_cursor>0</previous_cursor>

4. 将XML文件存储到ACCESS数据库中举行备份

假如不想备份的可以直接从第3步中到第5步,然则笔者,以为将数据转换成此构架后,越发轻易厥后的顺序操纵以及阅读数据。

关于XML的细致要领参考:吝啬的鬼

《在C#.net中怎样操纵XML》

www.cnblogs.com/weekzero/archive/2005/06/21/178140.html

下面最先读取适才从新浪微博服务器上要求获得的XML文件了。然后转换成ACCESS数据库内容。(固然你要先用ACCESS在指定目录下竖立一个*.mdb文件用来存储数据)

下面是对单个XML文件举行读取,并插进去到数据库中(这段代码是在ASP.NET中写的)

 public void readTsinaFriends(string fileName)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(Server.MapPath(fileName));  

       XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//猎取 根节点的一切子节点
       ;        //删除不必的一级节点,比方提醒人数的地点位置的标记
       XmlNode root = xmlDoc.SelectSingleNode("users");     //  XmlNodeList xnl = xmlDoc.SelectSingleNode("Employees").ChildNodes;
       for (int k = 0; k < nodeList.Count; k++)
       {
           XmlElement xe = (XmlElement)nodeList.Item(k);           if(xe.Name=="user")
           {//去掉XML文件中不须要的节点:next_cursor,previous_coursor以及user节点中的status,轻易XML直接转换成DataTable
                XmlNodeList nodeList1 = xmlDoc.SelectNodes("users/user");//获得一切的标签user一级节点

                foreach (XmlNode xmlNodeTemp in nodeList1)
                {                    if (xmlNodeTemp.LastChild.Name == "status")//移除每一个user节点中的"status"子节点--(平常情况下此节点都放在末了一个,所以就不遍历了,直接地点定位)
                    {
                        xmlNodeTemp.RemoveChild(xmlNodeTemp.LastChild);
                    }                
                }
              
               
           }           else if (xe.Name == "next_cursor" || xe.Name == "previous_cursor")
           {
               root.RemoveChild(xe);               if (k < nodeList.Count) k = k - 1;
           }
       }        string tbxml = xmlDoc.OuterXml;
        DataTable dt = new DataTable();

        DataSet ds = new DataSet();
        System.IO.StringReader reader = new System.IO.StringReader(tbxml);
        ds.ReadXml(reader);
        dt = ds.Tables[0];//假如XML文本中有同名的父子节点,那末此语句就会多读出一条数据,这多是此API函数的局限性吧

        DataTable dtCopy = dt.Copy();        //dtCopy.Columns.Remove("url");
        //dtCopy.Columns.Remove("profile_image_url");
        dtCopy.Columns.Remove("description"); //这个字段内里字符编码不太划定规矩,在插进去ACCESS的时刻总有题目,而且用途不大,所以就去除了。(又偷懒了呃)


        DataRow drTemp = dtCopy.NewRow();        string strInsert = string.Empty;

        OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\收集软文\\API_微波\\weibo.mdb");
        aConnection.Open();        for (int i = 0; i < dtCopy.Rows.Count - 1; i++)
        {
            drTemp = dtCopy.Rows[i];
            strInsert = "'"+drTemp[0].ToString()+"','";            for (int j = 1; j < dtCopy.Columns.Count - 1; j++)
            {
                strInsert += (drTemp[j].ToString() + "','");
            }
            strInsert += drTemp[dtCopy.Columns.Count - 1].ToString() + "'";           
            string strCmd = "INSERT INTO Friends VALUES(" + strInsert + ")";

            
            OleDbCommand command = new
                OleDbCommand(strCmd, aConnection);
            command.ExecuteNonQuery();
        }
        aConnection.Close();
    }

对多个XML文件举行遍历,一个个导入到ACCESS数据库中:

 /// <summary>
    /// 将一切挚友都导出了,然后存储在ACCESS数据库中了。
    /// </summary>
    public void readAllXml()
    {        for (int i = 0; i < 8; i++)
        {            string fileName = "friends_" + Convert.ToString(i * 20) + "_" + Convert.ToString(i*20+20)+".xml";//根据存储XML文件时的定名划定规矩举行读取
            readTsinaFriends(fileName);
        }
    }

经由上面的操纵后,你再翻开你的ACCESS数据库文件weibo.mdb文件中对应的表,就可以看到所以的信息都已导入到ACCESS中了。以下图所示:

5. 对ACCESS数据库查询并写成RSS阅读器的OPML花样

关于制造RSS阅读器的OPML花样,须要的数据只要两条字段:一个是id字段,一个是name字段。

这个历程现实上就是对数据举行XML编码的历程,啥都不说了,一切都在代码中了(也是在ASP.NET工程中写的):

/// <summary>
    /// 竖立新浪微博的RSS文件
    /// </summary>
    public void CreateTsinaRssXmlFile()
    {

        OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\收集软文\\API_微波\\weibo.mdb");        string strCmd = "select id as idnum,screen_name as name from Friends";        //从ACCESS中猎取数据
        aConnection.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(strCmd, aConnection);
        DataSet ds = new DataSet();
        da.Fill(ds, "TSina");
        ds.DataSetName = "RssReader";
        DataTable dt = ds.Tables[0];//数据集的第0张表格


        XmlDocument xmldoc;

        XmlElement xmlelem;

        xmldoc = new XmlDocument();        //到场XML的声明段落
        XmlDeclaration xmldecl;
        xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null);
        xmldoc.AppendChild(xmldecl);        //到场一个根元素
        xmlelem = xmldoc.CreateElement(" ", "opml", " ");
        xmldoc.AppendChild(xmlelem);

        XmlNode root = xmldoc.SelectSingleNode("opml");//查找<opml> 节点


        XmlElement xeHead = xmldoc.CreateElement("head");//竖立一个<head>节点 
        //为head节点增添子节点
        XmlElement xeHeadsub = xmldoc.CreateElement("title");
        xeHeadsub.InnerText = "Rss Reader";//设置节点文本 
        xeHead.AppendChild(xeHeadsub);//增加到<head>子节点中 
        root.AppendChild(xeHead);//增加到<head>节点中 


        //增添body子节点,然后,将一切的RSS定阅信息悉数写入到body节点中心
        XmlElement xeBody = xmldoc.CreateElement("body");
        root.AppendChild(xeBody);        //第一层轮回是标签(文件夹轮回)因为本次只做一个标签,所以就只轮回一次了

        //RSS的文件夹属性节点
        XmlElement xe1 = xmldoc.CreateElement("outline");
        xe1.SetAttribute("text", "Tsina");//设置该节点title属性
        xe1.SetAttribute("title", "Tsina");//设置该节点title属性 --第一层的outline节点的属性示意的是RSS的标签或许说是文件夹


        //下面就要最先为此文件夹节点增加部属子节点,也就是增加一些本质的RSS地点了
        string strTitle = string.Empty;        string strText = string.Empty;        string strXmlUrl = string.Empty;        string strHtmlUrl = string.Empty;        for (int i = 0; i < dt.Rows.Count; i++)
        {
            strTitle = dt.Rows[i]["NAME"].ToString().Trim();
            strText = strTitle;
            strXmlUrl = "http://medcl.net/SinaRss.aspx?uid=" + dt.Rows[i]["IDNum"].ToString().Trim();
            strHtmlUrl = "http://t.sina.com.cn/" + dt.Rows[i]["IDNum"].ToString().Trim();

            XmlElement xesub1 = xmldoc.CreateElement("outline");
            xesub1.SetAttribute("text", strText);//设置该节点title属性
            xesub1.SetAttribute("title", strTitle);//设置该节点title属性 --第一层的outline节点的属性示意的是RSS的标签或许说是文件夹
            xesub1.SetAttribute("type", "rss");
            xesub1.SetAttribute("xmlUrl", strXmlUrl);

            xesub1.SetAttribute("htmlUrl", strHtmlUrl);
            xe1.AppendChild(xesub1);//增加到<Node>节点中 
        }
        xeBody.AppendChild(xe1);        //保留竖立好的XML文档
        xmldoc.Save(Server.MapPath("RssReader.xml"));

    }

末了在指定的目录下,顺序就自动生成了一个RssReader.xml的文件了。功德圆满了!

然后将此文件就可以导入到任何一个RSS阅读器中了,用户就可以经由历程RSS阅读器来猎取微博信息了,而且如今的RSS阅读器都有个一键转贴到微博的功用,很轻易的,不想转到自身微博的,也可以经由历程RSS阅读器直接珍藏到阅读器中。辛苦了两天,本日能有这么一点小效果,照样以为很不错的,呵呵,也祝人人也能好运。本次代码比较还须要种种完美,比方,怎样将所以的数据写成一个XML文件,这个笔者就暂时不做了,留给人人去做吧。

Rss阅读器效果图以下:

【相干引荐】

1. RSS高校入门教程

以上就是挪用API生成RSS资本文件的实例详解的细致内容,更多请关注ki4网别的相干文章!

标签:API生成RSS


欢迎 发表评论: