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); }
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); }
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); }
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); }