在我的程序中,我每隔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" );
}
}
}
}
有没有人知道造成错误的原因是什么,以及如何防止错误发生?
答案 0 :(得分:0)
听起来就像当你得到更新时,你只是将它添加到你已经拥有的结尾,可能在错误的结束标记之外?
<root>
<!-- Tags Galore -->
</root>
<addedTags></addedTags>
喜欢那个