第9节 在线共享内容的简易方式(RSS)
推荐给好友
打印
加入收藏
更新于2009-01-11 23:51:34

        RSS消息在Internet上到处都可用,传播当地天气预报、搜索引擎结果、DVD的队列信息、DVD新版本、头条新闻和体育新闻等信息。RSS 消息源的理念就是以一种简单的标准格式传输动态的文本信息。
        RSS起源于1999年,以一种简单,易懂的形式提供内容。RSS 消息源使用XML来描述数据,而不是使用 HTML来描述一个文件。一个RSS 消息源就是一个包含数据的简单的XML文件。这种在XML文件内传输数据的方法由RSS2.0规范所描述的,所有的RSS文件必须遵循XML1.0规范。RSS 消息源通常使用HTTP传输机制。

9.1 扩展标记语言(XML)
        XML是一种用于描述和解析信息的语言,类似于C语言的结构体。将数据被组成要素,并加一个开始标签和一个结束标签。结束标签的名称必须与开始标签相同,并在其前加一个“/”。开始和结束标签的名称给出了该要素的类型。
        XML 1.0规范参见:HTUhttp://www.w3.org/TR/REC-xml

        9.1.1 标签(Tags)
        下面就是一个标签例子:
                <TITLE>Advanced ColdFire TCP/IP Clients</TITLE>
        TITLE为元素类型,<TITLE>为开始标签,</TITLE>为结束标签。标签之间的就是数据。如同 C 语言的结构体,数据与类型有关。开始标签和结束标签间的数据即为元素内容。
        元素还可以包含其他元素,这样提供了一种用单一名字组织不同类型数据的方法。同C结构体,通过一个路径来引用该特殊数据块。例如:
        <APPNOTES>
                <BYEG>
                        <AN3455>ColdFire HTTP server</AN3455>
                        <AN3470>ColdFire TCP/IP Stack</AN3470>
                        <AN3492>ColdFire USB Stack</AN3492>
                </BYEG>
        </APPNOTES>

        9.1.2 特殊字符和转义序列
        &、<和>是特殊的XML字符,定义了XML 标签和转义序列。转义序列用代码而不是单一的符号来表示一个字符,以“&”开始并以“;”结束。为了将这些字符作为元素的内容,需使用以下替换:

表4 特殊字符


        9.1.3 CDATA 部件
        CDATA部件是XML规则的特例。在CDATA部件内部的所有内容都会被解析器忽略,允许在不转义的情况下就可以使用特殊字符。CDATA部件以字符串<!CDATA开始,并以字符串))>结束。在括号间的所有内容都会被 XML忽略。
        例如:
                <![CDATA[ character data here is ignored by XML parser ))>
                <![CDATA[ <THIS_IS_NOT_A_TAG> &lt; ]]>
        因为 XML 解析器会忽略掉括号间的内容,所以标签和转义序列都将被忽略,并被解释为文本或字符数据。

        9.1.4 在XML文件中找出文本或字符数据
        由XML1.0规范可知,文件的字符数据由所有没有标记的文本组成。这就包括在CDATA 部件中括号间的所有内容和主体中不在<>括号间的所有内容。主体中的转义序列代表一个单一的字符数据。
        为了将字符数据从XML文件中过滤出来,需先将所有的标签和<>括号去掉。然后,将转义序列转换为实际的字符。

        9.1.5 XML文件样例
        在下面的XML文件例子中,数据由描述这些数据的标签所封装组成一个C结构体。为了在XML文件中找到被描述的数据,可以用你想要的数据类型查找开始和结束标签。与该类型相关的数据就在这些标签之间。
        来自:HTUhttp://www.weather.gov/data/current_obs/KUGN.xUUmUTTUl
        <?xml version=1.0 encoding=ISO-8859-1 ?>
        <current_observation version=1.0 xmlns:xsd=http://www.w3.org/2001/XMLSchema
        xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
        xsi:noNamespaceSchemaLocation=http://www.weather.gov/data/current
        _obs/current_observation.xsd>
        <credit>NOAA's National Weather Service</credit>
        <credit_URL>http://weather.gov/</credit_URL>
        <image>
        <url>http://weather.gov/images/xml_logo.gif</url>
        <title>NOAA's National Weather Service</title>
        <link>http://weather.gov</link>
        </image>
        <suggested_pickup>15 minutes after the hour</suggested_pickup>
        <suggested_pickup_period>60</suggested_pickup_period>
        <location>Chicago / Waukegan, Waukegan Regional Airport, IL</location>
        <station_id>KUGN</station_id>
        <latitude>42.420</latitude>
        <longitude>-87.870</longitude>
        <observation_time>Last Updated on Jul 28, 10:52 am CDT</observation_time>
        <observation_time_rfc822>Sat, 28 Jul 2007 10:52:00 -0500 CDT</observation_time_rfc822 >
        <weather>Overcast</weather>
        <temperature_string>73 F (23 C)</temperature_string>
        <temp_f>73</temp_f>
        <temp_c>23</temp_c>
        <relative_humidity>81</relative_humidity>
        <wind_string>From the Northeast at 13 Gusting to 21 MPH</wind_string>
        <wind_dir>Northeast</wind_dir>
        <wind_degrees>30</wind_degrees>
        <wind_mph>12.65</wind_mph>
        <wind_gust_mph>21</wind_gust_mph>
        <pressure_string>29.98 (1014.1 mb)</pressure_string>
        <pressure_mb>1014.1</pressure_mb>
        <pressure_in>29.98</pressure_in>
        <dewpoint_string>67 F (19 C)</dewpoint_string>
        <dewpoint_f>67</dewpoint_f>
        <dewpoint_c>19</dewpoint_c>
        <heat_index_string>73 F (23 C)</heat_index_string>
        <heat_index_f>73</heat_index_f>
        <heat_index_c>23</heat_index_c>
        <windchill_string>NA</windchill_string>
        <windchill_f>NA</windchill_f>
        <windchill_c>NA</windchill_c>
        <visibility_mi>10.00</visibility_mi>
        <icon_url_base>http://weather.gov/weather/images/fcicons/</icon_url_base>
        <icon_url_name>ovc.jpg</icon_url_name>
        <two_day_history_url>http://www.weather.gov/data/obhistory/KUGN.html</two_day_history_url>
        <ob_url>http://www.nws.noaa.gov/data/METAR/KUGN.1.txt</ob_url>
        <disclaimer_url>http://weather.gov/disclaimer.html</disclaimer_url>
        <copyright_url>http://weather.gov/disclaimer.html</copyright_url>
        <privacy_policy_url>http://weather.gov/notice.html</privacy_policy_url>
        </current_observation>

        9.1.6 XML文件存在的问题
        XML文件的问题就是标签名的适应性问题。XML文件的创建者可以使用任何名字来描述数据。这样就需要有一种标准,对标签名以及类型是怎样与数据联系在一起等进行标准化。那种标准就是RSS标准。

9.2 RSS规范
        RSS是XML的一种,它将HTML结构嵌入XML中。RSS也是定义一组元素,并用那些元素定义一个基本模块。RSS规范中定义了很多种元素,本文只关注那些与RSS应用有关的元素。
        下面列出了一个典型的RSS文件:
        <channel>
                <title>The name of the channel</title>
                <link>URL to the HTML website corresponding to this channel</link>
                <description>Text describing the channel</description>
                <item>
                        < title>Item1 Title</title>
                        <link>URL of item 1</link>
                        <description>Text for item 1</description>
                </item>
                <item>
                        <title>Item2 Title</title>
                        <link>URL of item 2</link>
                        <description>Text for item 2</description>
                </item>
        </channel>
        将RSS文件的组织结构与报纸相比较。channel即为报纸的名称,item即为报纸的文章,title即为文章的标题,description即为文章的内容。

        9.2.1 RSS文件样例
        本样例的数据与上节XML文件相同。RSS标准定义了title和 description 标签名。这些标签名内包含了所要的数据。所有的RSS2.0 compliant feeds 都包含title和 description 这两个标签名。
        来自:http://www.weather.gov/data/current_obs/KUGN.rss
        <?xml version=1.0 encoding=ISO-8859-1 ?>
        <rss version=2.0 xmlns:dc=http://purl.org/dc/elements/1.1/>
        <channel>
        <title>Weather at Chicago / Waukegan, Waukegan Regional Airport, IL - via NOAA's
        National Weather Service</title>
        <link>http://www.weather.gov/data/current_obs/</link>
        <lastBuildDate>Sat, 28 Jul 2007 16:32:11 UT</lastBuildDate>
        <ttl>60</ttl>
        <description>Weather conditions from NOAA's National Weather Service.</description>
        <language>en-us</language>
        <managingEditor>robert.bunge@noaa.gov</managingEditor>
        <webMaster>w-nws.webmaster@noaa.gov</webMaster>
        <image>
        <url>http://www.weather.gov/images/xml_logo.gif</url>
        <title>NOAA - National Weather Service</title>
        <link>http://www.weather.gov/data/current_obs/</link>
        </image>
        <item>
        <title>Overcast and 73 degrees F at Chicago / Waukegan, Waukegan Regional Airport, IL</title>
        <link>http://weather.noaa.gov/weather/current/KUGN.html</link>
        <description>
        <![CDATA[
        <img src=http://weather.gov/weather/images/fcicons/ovc.jpg class=noaaWeatherIcon
        width=55 height=58 alt=Overcast style=float:left; /><br />
        ))>
        Winds are Northeast at 13 Gusting to 21 MPH. The pressure is 29.98 (1014.1 mb) and
        the humidity is 81%. The heat index is 73. Last Updated on Jul 28, 10:52 am CDT.
        </description>
        <guid isPermaLink=false>Sat, 28 Jul 2007 10:52:00 -0500 CDT</guid>
        </item>
        </channel>
        </rss>

9.3 RSS/XML字符数据过滤器
        为了将字符数据(你真正需要的信息)从 RSS 流中提取出来,必须将所有的元文件(metatext)进行过滤。任何可以处理的HTML都必须先被翻译然后才能进行处理。 例如,<br>在 HTML 中表示新的一行,而在 RSS 流中则为“&lt;br&gt;”。过滤器必须将&lt;br&gt;正确翻译为回车换行。其他的被嵌入到字符数据中的 HTML 标签还包括段落标签<p>和图像标签<IMG>,分别对应 RSS流中的“&lt;p&gt;”、“&lt;IMG…&gt;”。段落标签被翻译为回车换行,如果被嵌入的系统不能处理图像,那么图像标签就会被忽略。
        9.3.1 RSS/XML字符数据过滤器状态机
        字符数据过滤器被??为一个有限状态机,只使用2个全局变量,1个状态变量和一个 FILO 队列。FILO 队列用于存储先前的字符。键入过滤器的每个字节数据从左边进入FILO,当前字符的位置为filo_buff[FILO_BUFF_SIZE-1]。FILO的缓冲大小由宏FILO_BUFF_SIZE设置,必须比可能的最大标签名还大。
                #define FILO_BUFF_SIZE 32
        状态:
                STATE_ZERO
                STATE_TAGSEARCH
                STATE_INTAG
                STATE_PRINT
                STATE_SKIP
                STATE_SKIP_NON_ASCII
                STATE_SKIP_SPACE
                STATE_CDATA
                STATE_CDATA_PRINT
                STATE_CDATA_SKIP_AMP
                STATE_SKIP_INTAG
                STATE_IN_AMPERSAND
        全局变量:
                unsigned char filo_buff[FILO_BUFF_SIZE);
                unsigned char state;
                unsigned char EMG_rss_text_filter(unsigned char data, unsigned char **tag_filter)



图12 字符过滤状态机

        过滤器接收到一个XML或RSS流和一个标签表,仅输出被选中标签内的字符数据。标签表是一个指针数组,这些指针指向过滤器应该从中过滤出字符数据的标签字符串。
        过滤器通常返回 0。当处理表中一个标签的>时,过滤器为该标签返回其在数组中的索引(之前已找到<)。例如,若在RSS或XML流中检测到一个<title>标签则过滤器返回0,若检测到<description>标签,则返回2。
        Const unsigned char *tag_filter[] =
                {
                        {(const unsigned char *)”title”},
                        {(const unsigned char *)”description”},
                       {(const unsigned char *)””}
                };
        tag_filter指针数组样例。

图13 字符数组过滤器使用方法

        9.3.2 字符数据过滤器excercisor 的PC应用
        PC应用可用于验证状态机。它将XML或RSS流作为一个文件打开,该流经过有限状态机后,输出结果到控制台。
        // For testing read data from file, and send to filter
        EMG_init_rss_text_filter;
        for(; !feof(input_file);)
        {
                if ((length = fread(temp, 1, PACKET_SIZE, input_file))==0)
                        break;
                if (ferror(input_file))
                        break;
                for(i=0; i<length; i++)
                {
                        ret = EMG_rss_text_filter(temp[i), (unsigned char **)tag_filter);
                        if(ret) // Print a new line after each tag
                        printf(\n);
                }
        }
        利用9.2.1节的RSS流“RSS文件样例”,PC excercisor 输出的过滤结果如下:

图14 Kugn.rss Feed的过滤结果
        9.3.3 修改wget指令
        wget命令用HTTP协议从远程服务器获取文件。本应用将wget命令升级为可支持字符数据过滤器。语法为:
        wget <tag1><tag2> url
        <tag1>和<tag2>是可选的,前后必须用<>隔开。而且,标签之间不能有空格。通过下面的宏可以增加可接收的标签数:
        #define TAG_FILTER_SIZE 3

图15 用wget读取为过滤的RSS


图16 用wget和过滤器解析XML标签


图17 使用wget和过滤器的RSS Feed(上面未过滤,下面已过滤)


<<上一页    下一页>>
相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.