GeoRssLoader.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:3k
源码类别:

SilverLight

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.ServiceModel.Syndication;
  6. using System.Xml;
  7. using ESRI.ArcGIS.Client;
  8. using ESRI.ArcGIS.Client.Geometry;
  9. namespace ESRI.ArcGIS.Samples.GeoRss
  10. {
  11. public class GeoRssLoader
  12. {
  13. public class RssLoadedEventArgs : EventArgs
  14. {
  15. public object UserState { get; set; }
  16. public System.Collections.Generic.IEnumerable<Graphic> Graphics { get; set; }
  17. }
  18. public class RssLoadFailedEventArgs : EventArgs
  19. {
  20. public object UserState { get; set; }
  21. public Exception ex { get; set; }
  22. }
  23. public event EventHandler<RssLoadedEventArgs> LoadCompleted;
  24. public event EventHandler<RssLoadFailedEventArgs> LoadFailed;
  25. public void LoadRss(Uri feedUri, object userToken)
  26. {
  27. WebClient wc = new WebClient();
  28. wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
  29. wc.OpenReadAsync(feedUri, userToken);
  30. }
  31. //Adding symbols from each entry read from the feed to the graphics object of the layer
  32. private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
  33. {
  34. if (e.Error != null)
  35. {
  36. if(LoadFailed!=null)
  37. LoadFailed(this, new RssLoadFailedEventArgs()
  38. {
  39. ex = new Exception("Error in Reading the RSS feed. Try Again later!", e.Error),
  40. UserState = e.UserState
  41. });
  42. return;
  43. }
  44. ESRI.ArcGIS.Client.GraphicCollection graphics = new ESRI.ArcGIS.Client.GraphicCollection();
  45. using (Stream s = e.Result)
  46. {
  47. SyndicationFeed feed;
  48. List<SyndicationItem> feedItems = new List<SyndicationItem>();
  49. using (XmlReader reader = XmlReader.Create(s))
  50. {
  51. feed = SyndicationFeed.Load(reader);
  52. foreach (SyndicationItem feedItem in feed.Items)
  53. {
  54. SyndicationElementExtensionCollection ec = feedItem.ElementExtensions;
  55. string x = "";
  56. string y = "";
  57. foreach (SyndicationElementExtension ee in ec)
  58. {
  59. XmlReader xr = ee.GetReader();
  60. switch (ee.OuterName)
  61. {
  62. case ("lat"):
  63. {
  64. y = xr.ReadElementContentAsString();
  65. break;
  66. }
  67. case ("long"):
  68. {
  69. x = xr.ReadElementContentAsString();
  70. break;
  71. }
  72. case ("point"):
  73. {
  74. string sp = xr.ReadElementContentAsString();
  75. string[] sxsy = sp.Split(new char[] { ' ' });
  76. x = sxsy[1];
  77. y = sxsy[0];
  78. break;
  79. }
  80. }
  81. }
  82. if (!string.IsNullOrEmpty(x))
  83. {
  84. Graphic graphic = new Graphic()
  85. {
  86. Geometry = new MapPoint(Convert.ToDouble(x), Convert.ToDouble(y))
  87. };
  88. graphic.Attributes.Add("Title", feedItem.Title.Text);
  89. graphic.Attributes.Add("Summary", feedItem.Summary.Text);
  90. graphic.Attributes.Add("PublishDate", feedItem.PublishDate);
  91. graphic.Attributes.Add("Id", feedItem.Id);
  92. graphics.Add(graphic);
  93. }
  94. }
  95. }
  96. }
  97. //Invoking the initialize method of the base class to finish the initialization of the graphics layer:
  98. if (LoadCompleted != null)
  99. LoadCompleted(this, new RssLoadedEventArgs()
  100. {
  101. Graphics = graphics,
  102. UserState = e.UserState
  103. }
  104. );
  105. }
  106. }
  107. }