public override void Parse() { base.Parse(); //Uri currentBase = new Uri(Feed._base.ToString()); while (XmlReader.Read()) { if (XmlReader.NodeType == XmlNodeType.Element) { //if (XmlReader.HasAttributes) //{ // XmlReader.MoveToAttribute("xml:base"); // currentBase = new Uri(Feed._base, XmlReader.Value); //} switch (XmlReader.Name) { case "title" : XmlReader.MoveToContent(); Feed.Title = XmlReader.ReadString(); break; case "subtitle": XmlReader.MoveToContent(); Feed.Description = XmlReader.ReadString(); break; case "icon": XmlReader.MoveToContent(); Feed.Icon = XmlReader.ReadString(); break; case "logo": XmlReader.MoveToContent(); Image image = new Image(); image.Uri = XmlReader.ReadString(); Feed.Image = image; break; case "id": XmlReader.MoveToContent(); Feed.Id = XmlReader.ReadString(); break; case "updated": case "modified": XmlReader.MoveToContent(); Feed.Updated = DTHelper.ParseDateTime(XmlReader.ReadString()); break; case "author": XmlReader.MoveToContent(); Feed.Authors.Add(readPerson(XmlReader.ReadSubtree())); break; case "contributor": XmlReader.MoveToContent(); Feed.Contributors.Add(readPerson(XmlReader.ReadSubtree())); break; case "link": Link link = new Link(); while (XmlReader.MoveToNextAttribute()) { switch (XmlReader.Name) { case "href": link.href = XmlReader.Value; break; case "hreflang": link.hreflang = XmlReader.Value; break; case "length": link.length = XmlReader.Value; break; case "rel": link.rel = XmlReader.Value; break; case "title": link.title = XmlReader.Value; break; case "type": link.type = XmlReader.Value; break; } } normalizeFeedLink(link); break; case "rights": XmlReader.MoveToContent(); Feed.Copyright = XmlReader.ReadString(); break; case "category": Category category = new Category(); while (XmlReader.MoveToNextAttribute()) { switch (XmlReader.Name) { case "term": category.Term = XmlReader.Value; break; case "scheme": category.Scheme = XmlReader.Value; break; case "label": category.Label = XmlReader.Value; break; } } if (category.Label.Length == 0) category.Label = category.Term; Feed.Categories.Add(category); break; case "generator": Generator generator = new Generator(); while (XmlReader.MoveToNextAttribute()) { switch (XmlReader.Name) { case "uri": generator.Uri = XmlReader.Value; break; case "version": generator.Version = XmlReader.Value; break; } } XmlReader.MoveToContent(); generator.Name = XmlReader.ReadString(); Feed.Generator = generator; break; case "entry": XmlReader.MoveToContent(); readEntry(XmlReader.ReadSubtree()); break; } } } Complete(); }
public override void Parse() { base.Parse(); while (XmlReader.Read()) { if (XmlReader.Depth == 1) { if (XmlReader.NodeType == XmlNodeType.Element) { switch (XmlReader.Name) { case "title": XmlReader.MoveToContent(); Feed.Title = XmlReader.ReadString(); break; case "description": XmlReader.MoveToContent(); Feed.Description = XmlReader.ReadString(); break; case "link": XmlReader.MoveToContent(); Feed.WebUri = new FeedUri(XmlReader.ReadString()); break; case "language": XmlReader.MoveToContent(); Feed.Language = XmlReader.ReadString(); break; case "copyright": XmlReader.MoveToContent(); Feed.Copyright = XmlReader.ReadString(); break; case "managingEditor": XmlReader.MoveToContent(); Feed.Authors.Add(readPerson(XmlReader.ReadString())); break; case "webMaster": XmlReader.MoveToContent(); Feed.WebMaster = readPerson(XmlReader.ReadString()); break; case "pubDate": XmlReader.MoveToContent(); Feed.Published = DTHelper.ParseDateTime(XmlReader.ReadString()); break; case "lastBuildDate": XmlReader.MoveToContent(); Feed.Updated = DTHelper.ParseDateTime(XmlReader.ReadString()); break; case "category": Category category = new Category(); while (XmlReader.MoveToNextAttribute()) { if (XmlReader.Name == "domain") category.Scheme = XmlReader.Value; } XmlReader.MoveToContent(); category.Label = category.Term = XmlReader.ReadString(); Feed.Categories.Add(category); break; case "generator": Generator generator = new Generator(); XmlReader.MoveToContent(); generator.Name = XmlReader.ReadString(); if (Uri.IsWellFormedUriString(generator.Name, UriKind.Absolute)) generator.Uri = generator.Name; Feed.Generator = generator; break; case "docs": XmlReader.MoveToContent(); Feed.RssDocumentation = XmlReader.ReadString(); break; case "cloud": Cloud cloud = new Cloud(); int port = 0; while (XmlReader.MoveToNextAttribute()) { switch (XmlReader.Name) { case "domain": cloud.Domain = XmlReader.Value; break; case "path": cloud.Path = XmlReader.Value; break; case "port": Int32.TryParse(XmlReader.Value, out port); cloud.Port = port; break; case "protocol": cloud.Protocol = XmlReader.Value; break; case "registerProcedure": cloud.RegisterProcedure = XmlReader.Value; break; } } Feed.Cloud = cloud; break; case "ttl": int ttl = 0; XmlReader.MoveToContent(); Int32.TryParse(XmlReader.ReadString(), out ttl); Feed.Ttl = ttl; break; case "image": XmlReader.MoveToContent(); Feed.Image = readImage(XmlReader.ReadSubtree()); break; case "rating": break; // PICS is not yet implemented case "textInput": break; // The purpose of the <textInput> element is something of a mystery case "skipHours": XmlReader.MoveToContent(); short hour = 0; if (Int16.TryParse(XmlReader.ReadString(), out hour)) Feed.SkipHours.Add(hour); break; case "skipDays": XmlReader.MoveToContent(); switch (XmlReader.ReadString()) { case "Monday": Feed.SkipDays.Add(Days.Monday); break; case "Tuesday": Feed.SkipDays.Add(Days.Tuesday); break; case "Wednesday": Feed.SkipDays.Add(Days.Wednesday); break; case "Thursday": Feed.SkipDays.Add(Days.Thursday); break; case "Friday": Feed.SkipDays.Add(Days.Friday); break; case "Saturday": Feed.SkipDays.Add(Days.Saturday); break; case "Sunday": Feed.SkipDays.Add(Days.Sunday); break; } break; case "item": XmlReader.MoveToContent(); readItem(XmlReader.ReadSubtree()); break; default: if (readModules && XmlReader.Prefix != String.Empty) { IModule module = Feed.GetModule(XmlReader.Prefix); if (module != null) module.Parse(XmlReader.ReadSubtree()); } break; } } } } Complete(); }
private void readEntry(XmlReader subReader) { subReader.MoveToContent(); FeedItem feedItem = new FeedItem(); while (subReader.Read()) { if (subReader.NodeType == XmlNodeType.Element) { switch (subReader.Name) { case "title": subReader.MoveToContent(); feedItem.Title = subReader.ReadString(); break; case "id": subReader.MoveToContent(); FeedGuid guid = new FeedGuid(subReader.ReadString()); if(!Uri.IsWellFormedUriString(guid.Id, UriKind.Absolute)) guid.PermaLink = false; feedItem.Guid = guid; break; case "content": bool contentRead = false; while (subReader.MoveToNextAttribute()) { if (subReader.Name == "type") { if (subReader.Value == "xhtml") { subReader.MoveToContent(); feedItem.Content = subReader.ReadInnerXml(); feedItem.ContentType = TextType.Xhtml; contentRead = true; } else if (subReader.Value == "html") { feedItem.ContentType = TextType.Html; } } } if (!contentRead) { subReader.MoveToContent(); feedItem.Content = subReader.ReadString(); } break; case "summary": bool summaryRead = false; while (subReader.MoveToNextAttribute()) { if (subReader.Name == "type") { if (subReader.Value == "xhtml") { subReader.MoveToContent(); feedItem.Summary = subReader.ReadInnerXml(); feedItem.SummaryType = TextType.Xhtml; summaryRead = true; } else if (subReader.Value == "html") { feedItem.SummaryType = TextType.Html; } } } if (!summaryRead) { subReader.MoveToContent(); feedItem.Summary = subReader.ReadString(); } break; case "modified": case "updated": subReader.MoveToContent(); feedItem.Updated = DTHelper.ParseDateTime(subReader.ReadString()); break; case "published": case "created": subReader.MoveToContent(); feedItem.Published = DTHelper.ParseDateTime(subReader.ReadString()); break; case "author": subReader.MoveToContent(); feedItem.Authors.Add(readPerson(subReader.ReadSubtree())); break; case "contributor": subReader.MoveToContent(); feedItem.Contributors.Add(readPerson(subReader.ReadSubtree())); break; case "rights": subReader.MoveToContent(); feedItem.Copyright = subReader.ReadString(); break; case "category": Category category = new Category(); while (subReader.MoveToNextAttribute()) { switch (subReader.Name) { case "term": category.Term = subReader.Value; break; case "scheme": category.Scheme = subReader.Value; break; case "label": category.Label = subReader.Value; break; } } feedItem.Categories.Add(category); break; case "link": Link link = new Link(); while (subReader.MoveToNextAttribute()) { switch (subReader.Name) { case "href": link.href = subReader.Value; break; case "hreflang": link.hreflang = subReader.Value; break; case "length": link.length = subReader.Value; break; case "rel": link.rel = subReader.Value; break; case "title": link.title = subReader.Value; break; case "type": link.type = subReader.Value; break; } } //In case someone formats a link as <link>href</link> //we can tolerate that as well. if (String.IsNullOrEmpty(link.href)) { subReader.MoveToContent(); link.href = subReader.ReadString(); } normalizeFeedItemLink(feedItem, link); break; default: if (readModules && subReader.Prefix != String.Empty) readModuleItem(subReader, feedItem); break; } } } Feed.Items.Add(feedItem); }
private void readItem(XmlReader subReader) { subReader.MoveToContent(); m_CurrentFeedItem = new FeedItem(); while (subReader.Read()) { if (subReader.NodeType == XmlNodeType.Element) { m_CurrentNode = subReader.Name; switch (m_CurrentNode) { case "title": subReader.MoveToContent(); m_CurrentFeedItem.Title = subReader.ReadString(); break; case "description": subReader.MoveToContent(); try { // One feed had a hex character / & that couldnt be read with XmlReader. m_CurrentFeedItem.Content = subReader.ReadString(); } catch(Exception ex) { System.Diagnostics.Debug.WriteLine("Error reading the description of a feed item. Ignored usually: "+ex.Message); } break; case "link": subReader.MoveToContent(); FeedUri uri = new FeedUri(subReader.ReadString()); m_CurrentFeedItem.WebUris.Add(uri); break; case "author": subReader.MoveToContent(); m_CurrentFeedItem.Authors.Add(readPerson(subReader.ReadString())); break; case "category": Category category = new Category(); while (subReader.MoveToNextAttribute()) { if (subReader.Name == "domain") category.Scheme = subReader.Value; } subReader.MoveToContent(); category.Label = category.Term = subReader.ReadString(); m_CurrentFeedItem.Categories.Add(category); break; case "comments": subReader.MoveToContent(); m_CurrentFeedItem.CommentsUri = subReader.ReadString(); break; case "enclosure": Enclosure enclosure = new Enclosure(); while (subReader.MoveToNextAttribute()) { switch (subReader.Name) { case "url": enclosure.Uri = subReader.Value; break; case "length": int length = 0; if (Int32.TryParse(subReader.Value, out length)) enclosure.Length = length; break; case "type": enclosure.Type = subReader.Value; break; } } m_CurrentFeedItem.Enclosures.Add(enclosure); break; case "guid": FeedGuid guid = new FeedGuid(); if (subReader.MoveToFirstAttribute()) { if (subReader.Name == "isPermaLink" && subReader.Value == "false") guid.PermaLink = false; } subReader.MoveToContent(); guid.Id = subReader.ReadString(); m_CurrentFeedItem.Guid = guid; break; case "pubDate": subReader.MoveToContent(); m_CurrentFeedItem.Published = DTHelper.ParseDateTime(subReader.ReadString()); break; case "source": Source source = new Source(); if (subReader.MoveToFirstAttribute()) { if (subReader.Name == "url") source.Uri = subReader.Value; } subReader.MoveToContent(); source.Title = subReader.ReadString(); m_CurrentFeedItem.Source = source; break; default: if (readModules && subReader.Prefix != String.Empty) readModuleItem(subReader, m_CurrentFeedItem); break; } } } Feed.Items.Add(m_CurrentFeedItem); }