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}