internal new static AtomContent parse(XPathNavigator navigator) { AtomContent result_content = new AtomContent(); string content = string.Empty; XPathNavigator temp_navigator = navigator.Clone(); XPathNodeIterator it = temp_navigator.SelectDescendants( XPathNodeType.Element, true ); while ( it.MoveNext() ) { string name = it.Current.Name.ToLower(); int colon_index = name.IndexOf( ":" ); if ( colon_index != -1 ) name = name.Split( new char[] { ':' }, 2 )[1]; switch ( name ) { case "content": try { XPathNavigatorReader temp_reader = new XPathNavigatorReader( temp_navigator ); string base_uri = temp_reader.GetAttribute( "base", XmlNamespaces.Xml ); if ( base_uri != null && base_uri.Length > 0 ) result_content.XmlBase = new Uri( base_uri ); } catch { } try { result_content.XmlLang = AtomUtility.parseLanguage( it.Current.XmlLang ); } catch { } result_content.LocalName = name; XPathNavigatorReader reader = new XPathNavigatorReader( it.Current ); reader.Read(); content = reader.ReadInnerXml(); break; } } it = temp_navigator.Select( "@*" ); do { switch ( it.Current.Name.ToLower() ) { case "type": result_content.Type = AtomUtility.parseMediaType( it.Current.Value ); break; /* * mode はなさそうだ…。 */ case "mode": switch ( it.Current.Value.ToLower() ) { case "escaped": result_content.Mode = EncodedMode.Escaped; break; case "base64": result_content.Mode = EncodedMode.Base64; break; } break; } } while ( it.MoveNext() ); switch ( result_content.Mode ) { case EncodedMode.Escaped: content = AtomUtility.Unescape( content ); break; case EncodedMode.Base64: content = Encoding.Unicode.GetString( Base64.Decode( content ) ); break; } result_content.Content = content; return result_content; }
internal new static AtomContent Parse(XPathNavigator navigator) { AtomContent contentElement = new AtomContent(); string content = String.Empty; XPathNavigator nav = navigator.Clone(); // select the element itself XPathNodeIterator iter = nav.SelectDescendants(XPathNodeType.Element, true); while (iter.MoveNext()) { string name = iter.Current.Name.ToLower(); int idx = name.IndexOf(":"); if (idx != -1) { name = name.Split(new char[] { ':' }, 2)[1]; } switch (name) { case "content": try { XPathNavigatorReader navReader = new XPathNavigatorReader(nav); string baseUri = navReader.GetAttribute("base", XmlNamespaces.Xml); if (baseUri != null && baseUri.Length > 0) { contentElement.XmlBase = new Uri(baseUri); } } catch {} try { contentElement.XmlLang = Utils.Utils.ParseLanguage(iter.Current.XmlLang); } catch {} contentElement.LocalName = name; XPathNavigatorReader reader = new XPathNavigatorReader(iter.Current); reader.Read(); content = reader.ReadInnerXml(); break; } } // select the attributes iter = nav.Select("@*"); do { switch (iter.Current.Name.ToLower()) { case "type": contentElement.Type = Utils.Utils.ParseMediaType( iter.Current.Value); break; case "mode": { switch (iter.Current.Value.ToLower()) { case "escaped": contentElement.Mode = Mode.Escaped; break; case "base64": contentElement.Mode = Mode.Base64; break; } break; } } } while(iter.MoveNext()); switch (contentElement.Mode) { case Mode.Escaped: content = Utils.Utils.Unescape(content); break; case Mode.Base64: content = Encoding.Unicode.GetString( Utils.Utils.Base64Decode(content)); break; } contentElement.Content = content; return(contentElement); }
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 new static AtomContent Parse(XPathNavigator navigator) { AtomContent contentElement = new AtomContent(); string content = String.Empty; XPathNavigator nav = navigator.Clone(); // select the element itself XPathNodeIterator iter = nav.SelectDescendants(XPathNodeType.Element, true); while(iter.MoveNext()) { string name = iter.Current.Name.ToLower(); int idx = name.IndexOf(":"); if(idx != -1) name = name.Split(new char[] {':'}, 2)[1]; switch(name) { case "content": try { XPathNavigatorReader navReader = new XPathNavigatorReader(nav); string baseUri = navReader.GetAttribute("base", XmlNamespaces.Xml); if(baseUri != null && baseUri.Length > 0) contentElement.XmlBase = new Uri(baseUri); } catch {} try { contentElement.XmlLang = Utils.Utils.ParseLanguage(iter.Current.XmlLang); } catch {} contentElement.LocalName = name; XPathNavigatorReader reader = new XPathNavigatorReader(iter.Current); reader.Read(); content = reader.ReadInnerXml(); break; } } // select the attributes iter = nav.Select("@*"); do { switch(iter.Current.Name.ToLower()) { case "type": contentElement.Type = Utils.Utils.ParseMediaType( iter.Current.Value); break; case "mode": { switch(iter.Current.Value.ToLower()) { case "escaped": contentElement.Mode = Mode.Escaped; break; case "base64": contentElement.Mode = Mode.Base64; break; } break; } } } while(iter.MoveNext()); switch(contentElement.Mode) { case Mode.Escaped: content = Utils.Utils.Unescape(content); break; case Mode.Base64: content = Encoding.Unicode.GetString( Utils.Utils.Base64Decode(content)); break; } contentElement.Content = content; return contentElement; }
internal static AtomFeed Parse(XPathNavigator navigator, Uri ns) { AtomFeed feed = new AtomFeed(ns); 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)[1]; 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, ns); } 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.Atom03Version) && (attrIterator.Current.Value != DefaultValues.Atom10Version)) { string msg = String.Format("Atom {0} version is not supported!", attrIterator.Current.Value); throw new InvalidOperationException(msg); } } } break; } case "title": AtomContentConstruct titlecontent = AtomContentConstruct.Parse(iter.Current, ns); feed.Title = titlecontent; break; case "subtitle": feed.SubTitle = new AtomContentConstruct("subtitle", iter.Current.Value, ns); break; case "link": feed.Links.Add(AtomLink.Parse(iter.Current, ns)); break; case "author": feed.Author = AtomPersonConstruct.Parse(iter.Current, ns); break; case "contributor": feed.Contributors.Add(AtomPersonConstruct.Parse(iter.Current, ns)); break; case "tagline": feed.Tagline = AtomContentConstruct.Parse(iter.Current, ns); break; case "id": feed.Id = new Uri(iter.Current.Value); break; case "copyright": feed.Copyright = AtomContentConstruct.Parse(iter.Current, ns); break; case "info": feed.Info = AtomContentConstruct.Parse(iter.Current, ns); break; case "modified": feed.Modified = AtomDateConstruct.Parse(iter.Current, ns); break; case "entry": feed.Entries.Add(AtomEntry.Parse(iter.Current, ns)); break; } } while (iter.MoveNext()); return feed; }