예제 #1
0
        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();
        }
예제 #2
0
        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();
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }