using System;
using System.Collections;
using System.Xml;
using RSSCommon;
namespace RSSFeeder.Helpers{
/// <summary>
/// Helper class to read/write OPML documents
/// </summary>
public class OPMLHelper
{
public static IList ImportOPML( string fileName )
{
XmlDocument doc = new XmlDocument();
doc.Load( fileName );
ArrayList importedChannels = new ArrayList();
foreach( XmlElement outlineNode in doc.DocumentElement.SelectNodes(".//outline") )
{
string title = outlineNode.GetAttribute("title");
string outlookFolderPath = outlineNode.GetAttribute("ng:folderName");
string feedUrl = outlineNode.GetAttribute("xmlUrl");
// xmlurl is for Newsgator. When the whole world is using xmlUrl with 'U' capital,
// newsgator is using small 'u'
if( null == feedUrl || 0 == feedUrl.Length ) feedUrl = outlineNode.GetAttribute("xmlurl");
string htmlUrl = outlineNode.GetAttribute("htmlUrl");
// Same newsgator hack
if( null == htmlUrl || 0 == htmlUrl.Length ) htmlUrl = outlineNode.GetAttribute("htmlurl");
string folderType = outlineNode.GetAttribute("ng:folderType");
// Onlt newsgator provides outlook folder path
if( null == outlookFolderPath ) outlookFolderPath = string.Empty;
if( null != feedUrl && feedUrl.Length > 0 )
{
Channel newChannel = new Channel( 0, title, new Uri(feedUrl),
TimeSpan.FromMinutes(30), DateTime.MinValue, DateTime.Now, DateTime.MinValue,
outlookFolderPath, string.Empty, true, 0, 0, Channel.FolderCreationTypeEnum.Automatic_under_Base_Folder,
string.Empty, string.Empty,
string.Empty, string.Empty );
// Newsgator will give us a folder type
if( null != folderType )
{
Channel.FolderCreationTypeEnum type;
if( folderType == "auto" )
{
type = Channel.FolderCreationTypeEnum.Automatic_under_Base_Folder;
}
else
{
type = Channel.FolderCreationTypeEnum.Specific_Folder;
}
newChannel.FolderType = type;
}
DatabaseHelper.AddNewChannel( ref newChannel );
importedChannels.Add( newChannel );
}
}
return importedChannels;
}
public static void ExportOPML( IList channels, string fileName )
{
XmlTextWriter writer = new XmlTextWriter( fileName, RSSCommon.Constants.DefaultEncoding );
writer.IndentChar = '\t';
writer.Formatting = Formatting.Indented;
writer.WriteStartElement("opml");
writer.WriteAttributeString("xmlns:ng", "http://newsgator.com/schema/opml");
writer.WriteStartElement("body");
foreach( Channel channel in channels )
{
writer.WriteStartElement("outline");
writer.WriteAttributeString("title", channel.Title );
writer.WriteAttributeString("ng:folderName", channel.FolderPath );
writer.WriteAttributeString("xmlUrl", channel.FeedURL.ToString() );
writer.WriteAttributeString("htmlUrl", channel.FeedURL.ToString() );
writer.WriteAttributeString("ng:folderType",
( channel.FolderType == Channel.FolderCreationTypeEnum.Automatic_under_Base_Folder ?
"auto" : "manual" ) );
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
}
}
}
|