summaryrefslogtreecommitdiff
path: root/BloggerToDasBlog/trunk/src/app/BloggerToDasBlog.Console/BloggerReader.cs
blob: 3af31c6bff0a4a0ea9a7811acf5e07a8df15cc11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;

namespace BloggerToDasBlog.Console {
	public sealed class BloggerReader {
		#region Constructors

		private BloggerReader( ) {}

		#endregion

		#region Public Methods

		public static IList< IBloggerEntry > Read( Uri filePath ) {
			XmlDocument document = new XmlDocument( );
			document.LoadXml( File.ReadAllText( filePath.LocalPath ) );

			XmlNodeReader reader = new XmlNodeReader( document );
			reader.MoveToContent( );

			IList< IBloggerEntry > results = new List< IBloggerEntry >( );
			if ( reader.Read( ) ) {
				if ( reader.NodeType == XmlNodeType.Element ) {
					if ( String.Compare( reader.LocalName, BloggerEntryXmlElement.Root, true, CultureInfo.InvariantCulture ) == 0 ) {
						String entryNode;
						while ( !String.IsNullOrEmpty( entryNode = reader.ReadOuterXml( ) ) ) {
							IBloggerEntry entry = ParseSingle( entryNode );
							if ( null != entry ) {
								results.Add( entry );
							}
						}
						return results;
					}
				}
			}
			return null;
		}

		#endregion

		#region Private Methods

		private static IBloggerEntry ParseSingle( String resultXmlRecord ) {
			if ( String.IsNullOrEmpty( resultXmlRecord ) ) {
				return null;
			}
			XmlDocument document = new XmlDocument( );
			document.LoadXml( resultXmlRecord );
			XmlNodeReader reader = new XmlNodeReader( document );

			IBloggerEntry entry = new BloggerEntry( );
			reader.MoveToContent( );
			try {
				while ( reader.Read( ) ) {
					if ( reader.NodeType == XmlNodeType.Element ) {
						switch ( reader.LocalName.ToLower( CultureInfo.InvariantCulture ) ) {
							case BloggerEntryXmlElement.Title:
								entry.Title = reader.ReadString( );
								break;
							case BloggerEntryXmlElement.Body:
								entry.Body = reader.ReadString( );
								break;
							case BloggerEntryXmlElement.Author:
								entry.Author = reader.ReadString( );
								break;
							case BloggerEntryXmlElement.Date:
								DateTime dateTime;
								entry.Date = DateTime.TryParse( reader.ReadString( ), out dateTime ) ? dateTime : DateTime.MinValue;
								break;
							case BloggerCommentXmlElement.Root:
								String commentNode = reader.ReadOuterXml( );
								if ( !String.IsNullOrEmpty( commentNode ) ) {
									entry.Comments.Add( ParseComment( commentNode ) );
								}
								break;
						}
					}
				}
				return entry;
			}
			catch ( FormatException ) {
				return null;
			}
		}

		private static IBloggerComment ParseComment( string xml ) {
			if ( String.IsNullOrEmpty( xml ) ) {
				return null;
			}

			IBloggerComment comment = new BloggerComment( );
			XmlDocument document = new XmlDocument( );
			document.LoadXml( xml );
			XmlNodeReader reader = new XmlNodeReader( document );
			reader.MoveToContent( );

			while ( reader.Read( ) ) {
				if ( reader.NodeType == XmlNodeType.Element ) {
					switch ( reader.LocalName ) {
						case BloggerCommentXmlElement.Author:
							comment.Author = reader.ReadString( );
							break;
						case BloggerCommentXmlElement.Date:
							DateTime dateTime;
							comment.Date = DateTime.TryParse( reader.ReadString( ), out dateTime ) ? dateTime : DateTime.MinValue;
							break;

						case BloggerCommentXmlElement.Body:
							comment.Body = reader.ReadString( );
							break;
					}
				}
			}
			return comment;
		}

		#endregion
	}
}