Ejemplo n.º 1
0
        private static Metadata ParseMetadata(XElement element)
        {
            Metadata result = null;

            if (element != null && element.Name.LocalName == ELEMENT_METADATA)
            {
                result = new Metadata();
                foreach (var childElement in element.Elements())
                {
                    if (childElement.Name.Namespace == NAMESPACE_DC)
                    {
                        var dcElement = new DcElement
                        {
                            Id       = childElement.Attribute(ATTRIBUTE_ID)?.Value,
                            Language = childElement.Attribute(Const.ATTRIBUTE_LANGUAGE)?.Value,
                            Dir      = childElement.Attribute(ATTRIBUTE_DIR)?.Value,
                            Value    = childElement.Value
                        };
                        switch (childElement.Name.LocalName)
                        {
                        case DC_ELEMENT_CONTRIBUTOR: result.Contributors.Add(dcElement); break;

                        case DC_ELEMENT_COVERAGE: result.Coverages.Add(dcElement); break;

                        case DC_ELEMENT_CREATOR: result.Creators.Add(dcElement); break;

                        case DC_ELEMENT_DATE: result.Date = dcElement; break;

                        case DC_ELEMENT_DESCRIPTION: result.Descriptions.Add(dcElement); break;

                        case DC_ELEMENT_FORMAT: result.Formats.Add(dcElement); break;

                        case DC_ELEMENT_IDENTIFIER: result.Identifiers.Add(dcElement); break;

                        case DC_ELEMENT_LANGUAGE: result.Languages.Add(dcElement); break;

                        case DC_ELEMENT_PUBLISHER: result.Publishers.Add(dcElement); break;

                        case DC_ELEMENT_RELATION: result.Relations.Add(dcElement); break;

                        case DC_ELEMENT_RIGHTS: result.Rights.Add(dcElement); break;

                        case DC_ELEMENT_SOURCE: result.Sources.Add(dcElement); break;

                        case DC_ELEMENT_SUBJECT: result.Subjects.Add(dcElement); break;

                        case DC_ELEMENT_TITLE: result.Titles.Add(dcElement); break;

                        case DC_ELEMENT_TYPE: result.Types.Add(dcElement); break;

                        default: break;
                        }
                    }
                    else
                    {
                        switch (childElement.Name.LocalName)
                        {
                        case ELEMENT_META:
                        {
                            var metaElement = new MetaElement
                            {
                                Id       = childElement.Attribute(ATTRIBUTE_ID)?.Value,
                                Language = childElement.Attribute(Const.ATTRIBUTE_LANGUAGE)?.Value,
                                Dir      = childElement.Attribute(ATTRIBUTE_DIR)?.Value,
                                Scheme   = childElement.Attribute(ATTRIBUTE_SCHEME)?.Value,
                                Property = childElement.Attribute(ATTRIBUTE_PROPERTY)?.Value,
                                Refines  = childElement.Attribute(ATTRIBUTE_REFINES)?.Value,
                                Value    = childElement.Value,
                                Name     = childElement.Attribute(ATTRIBUTE_NAME)?.Value,
                                Content  = childElement.Attribute(ATTRIBUTE_CONTENT)?.Value,
                            };
                            result.Metas.Add(metaElement);
                        }
                        break;

                        case ELEMENT_LINK:
                        {
                            var linkElement = new LinkElement
                            {
                                Href      = childElement.Attribute(ATTRIBUTE_HREF)?.Value,
                                Rel       = childElement.Attribute(ATTRIBUTE_REL)?.Value,
                                Id        = childElement.Attribute(ATTRIBUTE_ID)?.Value,
                                Refines   = childElement.Attribute(ATTRIBUTE_REFINES)?.Value,
                                MediaType = childElement.Attribute(ATTRIBUTE_MEDIATYPE)?.Value,
                            };
                            result.Links.Add(linkElement);
                        }
                        break;

                        default: break;
                        }
                    }
                }
            }

            return(result);
        }
Ejemplo n.º 2
0
        internal static AtomFeed Parse(XPathNavigator navigator)
        {
            AtomFeed feed = new AtomFeed();

            XPathNavigator    nav  = navigator.Clone();
            XPathNodeIterator iter = nav.SelectChildren(XPathNodeType.All);

            do
            {
                string name = iter.Current.Name.ToLower();
                int    idx  = name.IndexOf(":");
                if (idx != -1)
                {
                    name = name.Split(new char[] { ':' }, 2)[0];
                }

                switch (name)
                {
                case "feed":
                {
                    try
                    {
                        XPathNavigatorReader reader = new XPathNavigatorReader(nav);
                        string baseUri = reader.GetAttribute("base", XmlNamespaces.Xml);
                        if (baseUri != null && baseUri.Length > 0)
                        {
                            feed.XmlBase = new Uri(baseUri);
                        }
                    }
                    catch {}

                    try
                    {
                        feed.Uri = FindAlternateUri(iter.Current);
                    }
                    catch {}

                    try
                    {
                        feed.XmlLang = Utils.Utils.ParseLanguage(iter.Current.XmlLang);
                    }
                    catch {}

                    XPathNodeIterator attrIterator = nav.Select("@*");
                    while (attrIterator.MoveNext())
                    {
                        if (attrIterator.Current.Name.ToLower() == "version")
                        {
                            if (attrIterator.Current.Value != DefaultValues.AtomVersion)
                            {
                                string msg = string.Format("Atom {0} version is not supported!", attrIterator.Current.Value);
                                throw new InvalidOperationException(msg);
                            }
                        }
                    }
                    break;
                }

                case "title":
                    AtomContentConstruct content = AtomContentConstruct.Parse(iter.Current);
                    feed.Title = content;
                    break;

                case "link":
                    feed.Links.Add(AtomLink.Parse(iter.Current));
                    break;

                case "author":
                    feed.Author = AtomPersonConstruct.Parse(iter.Current);
                    break;

                case "contributor":
                    feed.Contributors.Add(AtomPersonConstruct.Parse(iter.Current));
                    break;

                case "tagline":
                    feed.Tagline = AtomContentConstruct.Parse(iter.Current);
                    break;

                case "id":
                    feed.Id = new Uri(iter.Current.Value);
                    break;

                case "copyright":
                    feed.Copyright = AtomContentConstruct.Parse(iter.Current);
                    break;

                case "info":
                    feed.Info = AtomContentConstruct.Parse(iter.Current);
                    break;

                case "modified":
                    feed.Modified = AtomDateConstruct.Parse(iter.Current);
                    break;

                case "entry":
                    feed.Entries.Add(AtomEntry.Parse(iter.Current));
                    break;

                case "dc":
                    feed.AdditionalElements.Add(DcElement.Parse(iter.Current));
                    break;
                }
            } while(iter.MoveNext());

            return(feed);
        }
Ejemplo n.º 3
0
        internal static AtomEntry Parse(XPathNavigator navigator)
        {
            AtomEntry entry = new AtomEntry();

            XPathNavigator    nav  = navigator.Clone();
            XPathNodeIterator iter = nav.SelectDescendants(XPathNodeType.All, true);

            while (iter.MoveNext())
            {
                string name = iter.Current.Name.ToLower();
                int    idx  = name.IndexOf(":");
                if (idx != -1)
                {
                    name = name.Split(new char[] { ':' }, 2)[0];
                }

                switch (name)
                {
                case "entry":
                    try
                    {
                        entry.Uri     = FindAlternateUri(iter.Current);
                        entry.XmlLang = Utils.Utils.ParseLanguage(iter.Current.XmlLang);
                    }
                    catch {}
                    break;

                case "title":
                    AtomContentConstruct content = AtomContentConstruct.Parse(iter.Current);
                    entry.Title = content;
                    break;

                case "link":
                    entry.Links.Add(AtomLink.Parse(iter.Current));
                    break;

                case "author":
                    entry.Author = AtomPersonConstruct.Parse(iter.Current);
                    break;

                case "contributor":
                    entry.Contributors.Add(AtomPersonConstruct.Parse(iter.Current));
                    break;

                case "id":
                    entry.Id = new Uri(iter.Current.Value);
                    break;

                case "modified":
                    entry.Modified = AtomDateConstruct.Parse(iter.Current);
                    break;

                case "issued":
                    entry.Issued = AtomDateConstruct.Parse(iter.Current);
                    break;

                case "created":
                    entry.Created = AtomDateConstruct.Parse(iter.Current);
                    break;

                case "summary":
                    entry.Summary = AtomContentConstruct.Parse(iter.Current);
                    break;

                case "content":
                    entry.Contents.Add(AtomContent.Parse(iter.Current));
                    break;

                case "dc":
                    entry.AdditionalElements.Add(DcElement.Parse(iter.Current));
                    break;
                }
            }

            return(entry);
        }
Ejemplo n.º 4
0
        internal static AtomEntry Parse(XPathNavigator navigator, Uri ns)
        {
            AtomEntry entry = new AtomEntry(ns);

            XPathNavigator    nav  = navigator.Clone();
            XPathNodeIterator iter = nav.SelectDescendants(XPathNodeType.All, true);

            while (iter.MoveNext())
            {
                string name = iter.Current.Name.ToLower();
                int    idx  = name.IndexOf(":");
                if (idx != -1)
                {
                    string prefix;
                    prefix = name.Split(new char[] { ':' }, 2)[0];
                    if (prefix == "atom")
                    {
                        name = name.Split(new char[] { ':' }, 2)[1];
                    }
                }

                switch (name)
                {
                case "entry":
                    try
                    {
                        entry.Uri     = FindAlternateUri(iter.Current, ns);
                        entry.XmlLang = Utils.Utils.ParseLanguage(iter.Current.XmlLang);
                    }
                    catch {}
                    break;

                case "title":
                    AtomContentConstruct content = AtomContentConstruct.Parse(iter.Current, ns);
                    entry.Title = content;
                    break;

                case "link":
                    entry.Links.Add(AtomLink.Parse(iter.Current, ns));
                    break;

                case "author":
                    entry.Author = AtomPersonConstruct.Parse(iter.Current, ns);
                    break;

                case "contributor":
                    entry.Contributors.Add(AtomPersonConstruct.Parse(iter.Current, ns));
                    break;

                case "id":
                    entry.Id = new Uri(iter.Current.Value);
                    break;

                case "modified":
                case "updated":
                    entry.Modified = AtomDateConstruct.Parse(iter.Current, ns);
                    break;

                case "issued":
                    entry.Issued = AtomDateConstruct.Parse(iter.Current, ns);
                    break;

                case "created":
                case "published":
                    entry.Created = AtomDateConstruct.Parse(iter.Current, ns);
                    break;

                case "summary":
                    entry.Summary = AtomContentConstruct.Parse(iter.Current, ns);
                    break;

                case "content":
                    entry.Contents.Add(AtomContent.Parse(iter.Current, ns));
                    break;

                case "dc:title":
                case "dc:creator":
                case "dc:subject":
                case "dc:description":
                case "dc:publisher":
                case "dc:contributor":
                case "dc:date":
                case "dc:type":
                case "dc:format":
                case "dc:identifier":
                case "dc:source":
                case "dc:language":
                case "dc:relation":
                case "dc:coverage":
                case "dc:rights":
                    entry.AdditionalElements.Add(DcElement.Parse(iter.Current, ns));
                    break;
                }
            }

            return(entry);
        }