您的位置:首页 > 其它

IP得到天气预报(3)———XML中CDATA的提取

2008-11-19 17:17 549 查看
上一个Session中,我们可以得到其中的部分信息了。也就是说,如果你自己看的话,就会发现雅虎的天气中,这样读取XML我们也只能得到相应的最低温度,最高温度。或者明天的,或者今天的湿度风速。这是东西都是每天早上或者某个时间段更新好了的。如果你要得到现在这个时间的温度,还有大家可能也看到了。如何能提取出数据库更新的DATA中的内容呢?仔细看XML不难得出。我们想要的就在description里面的CDATA。而XML的读取是不可以深入这个节点之内的。<Img>中,存储现在天气的图片。Fair是现在的天气状况。后面“,”之后那个3C就是现在的温度了。唯一的办法的就是吧这里面的内容当成HTML逐个的分析提取了。在仔细的看,多少还是能得到一定的规律的:)

- <description>
- <![CDATA[
<img src="http://l.yimg.com/us.yimg.com/i/us/we/52/34.gif"/><br />
<b>Current Conditions:</b><br />
Fair, 3 C<BR />
<BR /><b>Forecast:</b><BR />
Wed - Clear. High: 6 Low: -3<br />
Thu - Sunny. High: 12 Low: -3<br />
<br />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Beijing__CH/*http://weather.yahoo.com/forecast/CHXX0008_c.html">Full Forecast at Yahoo! Weather</a><BR/>
(provided by The Weather Channel)<br/>

]]>
</description>


图片URL提取:简单说下思路,首先得到description定位之后的innertext,就是所有的内容。图片的提取比较简单,因为这段HTML还算是正规的。而img中我们无非要使用SRC,这样的话就直接使用正则表达式进行过滤吧。

protected string GetImgURL(string aUrlXML)
{
XmlDocument aDoc = new XmlDocument();
aDoc.Load(aUrlXML);
XmlNodeList nodes = aDoc.GetElementsByTagName("description");
string innnerHTML = string.Empty;
foreach (XmlNode node in nodes)
{
innnerHTML = node.InnerText.ToString();
}
Regex regex = new Regex("<img .*src=(\"|')?(\\S*)(\"|')");
innnerHTML = (regex.Match(innnerHTML).ToString()).TrimStart("<img src=".ToCharArray());
innnerHTML = innnerHTML.TrimStart("<img src=".ToCharArray()).Trim("\"".ToCharArray());
return innnerHTML;
}


上面函数直接提取出的innerHTML就是图片的URL了。也就是IMG中的SRC了。接下来比较费事的就剩下分析全部的HTML如何定位并且提取“Fair,3c”这个内容了。仔细看的话,这段数据位于第二个<br>和第三个<br>之间。由于工作人员写的还算是正规,于是可以通过字符串处理的几个函数进行定位了。详细的函数说明MSDN中有非常好的说明和及其繁琐和复杂而又变态的例子,喜欢的自己琢磨去吧。(PS废话一句,那帮人真是闲的把那几个例子写的还不如别人随边说一句话呢)我就代码说话,思路已经讲的很清楚了。具体实践过城中由于个别的特殊符号的出现我们还是需要具体问题具体分析的。下面函数得出结果。返回现在的温度。我要的是那个“3c”。写得有点啰嗦,不过好懂。

protected string GetTempNow(string aUrlXML)
{
XmlDocument aDoc = new XmlDocument();
aDoc.Load(aUrlXML);
XmlNodeList nodes = aDoc.GetElementsByTagName("description");
string innerHTML = string.Empty;
foreach (XmlNode node in nodes)
{
innerHTML = node.InnerText.ToString();
}
innerHTML = innerHTML.ToLower();
int countHTML = innerHTML.IndexOf("br");
innerHTML = innerHTML.Substring(countHTML + 2);
countHTML = innerHTML.IndexOf("br");
innerHTML = innerHTML.Substring(countHTML + 5);
countHTML = innerHTML.IndexOf("br");
innerHTML = innerHTML.Remove(countHTML - 1, innerHTML.Length - countHTML).Trim("\n".ToCharArray());
string[] result = innerHTML.Split(",".ToCharArray());
innerHTML = result[1];
return innerHTML;
}



总结:基本通过上面的几个步骤的提取和分析,就可以把几乎所有想要的数据提取出来了。剩下的就是前台页面的制作和美化了。

测试地址

简单加个链接目录,有兴趣的可以一起研究下:)

IP得到天气预报(1)———数据分析存储

IP得到天气预报(2)———IP运算和数据处理

IP得到天气预报(3)———XML中CDATA的提取

IP得到天气预报(4)———制作自己的RSS订阅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: