main
  1using System;
  2using System.Collections.Generic;
  3using System.Globalization;
  4using System.IO;
  5using System.Xml;
  6
  7namespace BloggerToDasBlog.Console {
  8	public sealed class BloggerReader {
  9		#region Constructors
 10
 11		private BloggerReader( ) {}
 12
 13		#endregion
 14
 15		#region Public Methods
 16
 17		public static IList< IBloggerEntry > Read( Uri filePath ) {
 18			XmlDocument document = new XmlDocument( );
 19			document.LoadXml( File.ReadAllText( filePath.LocalPath ) );
 20
 21			XmlNodeReader reader = new XmlNodeReader( document );
 22			reader.MoveToContent( );
 23
 24			IList< IBloggerEntry > results = new List< IBloggerEntry >( );
 25			if ( reader.Read( ) ) {
 26				if ( reader.NodeType == XmlNodeType.Element ) {
 27					if ( String.Compare( reader.LocalName, BloggerEntryXmlElement.Root, true, CultureInfo.InvariantCulture ) == 0 ) {
 28						String entryNode;
 29						while ( !String.IsNullOrEmpty( entryNode = reader.ReadOuterXml( ) ) ) {
 30							IBloggerEntry entry = ParseSingle( entryNode );
 31							if ( null != entry ) {
 32								results.Add( entry );
 33							}
 34						}
 35						return results;
 36					}
 37				}
 38			}
 39			return null;
 40		}
 41
 42		#endregion
 43
 44		#region Private Methods
 45
 46		private static IBloggerEntry ParseSingle( String resultXmlRecord ) {
 47			if ( String.IsNullOrEmpty( resultXmlRecord ) ) {
 48				return null;
 49			}
 50			XmlDocument document = new XmlDocument( );
 51			document.LoadXml( resultXmlRecord );
 52			XmlNodeReader reader = new XmlNodeReader( document );
 53
 54			IBloggerEntry entry = new BloggerEntry( );
 55			reader.MoveToContent( );
 56			try {
 57				while ( reader.Read( ) ) {
 58					if ( reader.NodeType == XmlNodeType.Element ) {
 59						switch ( reader.LocalName.ToLower( CultureInfo.InvariantCulture ) ) {
 60							case BloggerEntryXmlElement.Title:
 61								entry.Title = reader.ReadString( );
 62								break;
 63							case BloggerEntryXmlElement.Body:
 64								entry.Body = reader.ReadString( );
 65								break;
 66							case BloggerEntryXmlElement.Author:
 67								entry.Author = reader.ReadString( );
 68								break;
 69							case BloggerEntryXmlElement.Date:
 70								DateTime dateTime;
 71								entry.Date = DateTime.TryParse( reader.ReadString( ), out dateTime ) ? dateTime : DateTime.MinValue;
 72								break;
 73							case BloggerCommentXmlElement.Root:
 74								String commentNode = reader.ReadOuterXml( );
 75								if ( !String.IsNullOrEmpty( commentNode ) ) {
 76									entry.Comments.Add( ParseComment( commentNode ) );
 77								}
 78								break;
 79						}
 80					}
 81				}
 82				return entry;
 83			}
 84			catch ( FormatException ) {
 85				return null;
 86			}
 87		}
 88
 89		private static IBloggerComment ParseComment( string xml ) {
 90			if ( String.IsNullOrEmpty( xml ) ) {
 91				return null;
 92			}
 93
 94			IBloggerComment comment = new BloggerComment( );
 95			XmlDocument document = new XmlDocument( );
 96			document.LoadXml( xml );
 97			XmlNodeReader reader = new XmlNodeReader( document );
 98			reader.MoveToContent( );
 99
100			while ( reader.Read( ) ) {
101				if ( reader.NodeType == XmlNodeType.Element ) {
102					switch ( reader.LocalName ) {
103						case BloggerCommentXmlElement.Author:
104							comment.Author = reader.ReadString( );
105							break;
106						case BloggerCommentXmlElement.Date:
107							DateTime dateTime;
108							comment.Date = DateTime.TryParse( reader.ReadString( ), out dateTime ) ? dateTime : DateTime.MinValue;
109							break;
110
111						case BloggerCommentXmlElement.Body:
112							comment.Body = reader.ReadString( );
113							break;
114					}
115				}
116			}
117			return comment;
118		}
119
120		#endregion
121	}
122}