读取GeoRSS提要时C#中的文件意外结束

时间:2012-09-16 13:23:43

标签: c# xml

在我的程序中,我每隔10秒从一个网站上获取GeoRSS。只要没有新项目添加到GeoRSS提要,程序就可以正常工作(即我可以正确地获取和解析rss - 当现有rss项的元素更改其值时)。但是,只要将新项目添加到rss Feed,我就会收到以下错误:

  

解析名称时发生了意外的文件结束。第85行,第13位。

Stacktrace:

       at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
   at System.Xml.XmlTextReaderImpl.ParseQName(Boolean isQName, Int32 startOffset, Int32& colonPos)
   at System.Xml.XmlTextReaderImpl.ParseElement()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlReader.MoveToContent()
   at System.Xml.XmlReader.IsStartElement()
   at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItemFrom(XmlReader reader, SyndicationItem result, Uri feedBaseUri)
   at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItem(XmlReader reader, SyndicationFeed feed)
   at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItems(XmlReader reader, SyndicationFeed feed, Boolean& areAllItemsRead)
   at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadXml(XmlReader reader, SyndicationFeed result)
   at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadFrom(XmlReader reader)
   at System.ServiceModel.Syndication.SyndicationFeed.Load[TSyndicationFeed](XmlReader reader)
   at Master.Model.ResourceManagerService.wc_OpenReadCompleted(Object sender, OpenReadCompletedEventArgs e) in C:\Users\polle\Documents\Visual Studio 2010\Projects\Master(23)\LSCommMaster\Master\Master\Services\ResourceManagerService.cs:line 319
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherOperation operation, CancellationToken cancellationToken, TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run()
   at Master.App.Main() in C:\Users\polle\Documents\Visual Studio 2010\Projects\Master(23)\LSCommMaster\Master\Master\obj\Debug\App.g.cs:line 0
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

我用来获取rss的代码包含在下面:

public static void FetchRSS(string url)
        {            

        if (url != String.Empty)
        {
            LoadRSS(url.Trim());
            DispatcherTimer UpdateTimer = new System.Windows.Threading.DispatcherTimer();
            UpdateTimer.Interval = new TimeSpan(0, 0, 0, 0, 10000);
            UpdateTimer.Tick += (evtsender, args) =>
            {
                LoadRSS(url.Trim());
            };
            UpdateTimer.Start();
        }
    }

    private static void LoadRSS(string uri)
    {
        Trace.WriteLine("Fetching rss feed");
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += wc_OpenReadCompleted;
        Uri feedUri = new Uri(uri, UriKind.Absolute);
        wc.OpenReadAsync(feedUri);
    }

    private static void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {

        if (e.Error != null)
        {
            Trace.WriteLine("Error in Reading Feed. Try Again later!");
            return;
        }

        using (Stream s = e.Result)
        {
            SyndicationFeed feed;
            List<SyndicationItem> feedItems = new List<SyndicationItem>();

            using (XmlReader reader = XmlReader.Create(s))
            {
                try
                {
                    feed = SyndicationFeed.Load(reader);
                    foreach (SyndicationItem feedItem in feed.Items)
                    {
                        SyndicationElementExtensionCollection ec = feedItem.ElementExtensions;

                        string title = feedItem.Title.Text;
                        string x = "";
                        string y = "";
                        string state = "not available";
                        string type = "not available";
                        string task = "not available";

                        foreach (SyndicationElementExtension ee in ec)
                        {
                            XmlReader xr = ee.GetReader();

                            switch (ee.OuterName)
                            {
                                case ("lat"):
                                    {
                                        y = xr.ReadElementContentAsString();
                                        break;
                                    }
                                case ("long"):
                                    {
                                        x = xr.ReadElementContentAsString();
                                        break;
                                    }
                                case ("point"):
                                    {
                                        string p = xr.ReadElementString();
                                        string[] coordinates = p.Split(' ');                                            
                                        y = coordinates[0];
                                        x = coordinates[1];
                                        break;
                                    }
                                case ("state"):
                                    {
                                        state = xr.ReadElementString();                                       
                                        break;
                                    }
                                case ("type"):
                                    {
                                        type = xr.ReadElementString();
                                        break;
                                    }
                                case ("taskDescription"):
                                    {
                                        task = xr.ReadElementString();
                                        break;
                                    }
                            }

                        }

                        if (!string.IsNullOrEmpty(x))
                        {
                            Resource resource = new Resource()
                            {
                                Geometry = new MapPoint(Convert.ToDouble(x, System.Globalization.CultureInfo.InvariantCulture),
                                Convert.ToDouble(y, System.Globalization.CultureInfo.InvariantCulture), new SpatialReference(4326))
                            };

                            resource.Attributes.Add("TITLE", title);
                            resource.Attributes.Add("STATE", state);
                            resource.Attributes.Add("TYPE", type);
                            resource.Attributes.Add("TASK", task);
                            resource.Attributes.Add("PENDINGTASK", "none");

                            resource.Title = title;
                            resource.TypeDescription = type;
                            resource.State = state;
                            resource.TaskDescription = task;
                            resource.PendingTask = "none";

                            ResourceDataReceivedMessage msg = new ResourceDataReceivedMessage() { Resource = resource };
                            Messenger.Default.Send<ResourceDataReceivedMessage>(msg);

                        }
                        else
                        {
                            Trace.WriteLine("STRING IS NULL OR EMPTY");
                        }
                    }
                }
                catch
                {
                    Trace.WriteLine("Exception occurred while fetching RSS feed" );
                }

            }
        }
    }

有没有人知道造成错误的原因是什么,以及如何防止错误发生?

1 个答案:

答案 0 :(得分:0)

听起来就像当你得到更新时,你只是将它添加到你已经拥有的结尾,可能在错误的结束标记之外?

<root>
    <!-- Tags Galore -->
</root>
<addedTags></addedTags>

喜欢那个