Microsoft Feeds API, import and export feed lists
Like promised the next episode of the Really Simple Sample. In this episode I will present the next step of importing and exporting feed lists through an xml file. The format can now handle recursive folders and feeds like it is supposed to be. I have coded the FeedImportExport class, an instance of this class can import and export feeds and folders from/to an xml file, it makes use of the data classes FeedData, FeedFolderData and FeedImports.
using System;
using System.Collections.Generic;
using System.Text;
namespace Widec.Feeds{
public class FeedData {
[System.Xml.Serialization.XmlAttribute("name")]
public string Name;
[System.Xml.Serialization.XmlAttribute("url")]
public string Url;
}
public class FeedFolderData {
[System.Xml.Serialization.XmlAttribute("name")]
public string Name;
[System.Xml.Serialization.XmlElement("feed")]
public List Feeds;
[System.Xml.Serialization.XmlElement("folder")]
public List Folders;
}
[System.Xml.Serialization.XmlRoot("mfi")]
public class FeedImports {
[System.Xml.Serialization.XmlElement("folder")]
public List Folders;
[System.Xml.Serialization.XmlElement("feed")]
public List Feeds;
public static FeedImports Deserialize(string filename) {
using (System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)) {
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(FeedImports));
return (FeedImports)serializer.Deserialize(stream);
}
}
public void Serialize(string filename) {
using (System.IO.FileStream stream = new System.IO.FileStream(filename,
System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite)) {
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(FeedImports));
serializer.Serialize(stream,this);
}
}
}
}
The FeedImportExport class is a basic recursive import and export reader/writer. You use the Import and Export method to do your work, these methods call the recursive ImportFeed/ExportFeed and ImportFeedFolder/ExportFeedFolder methods. The Export method has one additional feature, it splits the pathname of the FeedFolder and generates the needed folder elements in the xml.
using System;
using System.Collections.Generic;
using System.Text;
using Feeds;
namespace Widec.Feeds {
public class FeedImportExport{
public void Import(FeedImports import) {
IFeedsManager manager = new FeedsManagerClass();
IFeedFolder rootFolder = (IFeedFolder)manager.RootFolder;
if (import.Folders != null) {
foreach (FeedFolderData folderData in import.Folders) {
ImportFeedFolder(folderData, rootFolder);
}
}
if (import.Feeds != null) {
foreach (FeedData feedData in import.Feeds) {
ImportFeed(feedData, rootFolder);
}
}
}
public FeedImports Export(string folderPath) {
FeedImports import = new FeedImports();
import.Folders = new List();
IFeedsManager manager = new FeedsManagerClass();
IFeedFolder exportFolder = (IFeedFolder)manager.GetFolder(folderPath);
string[] Folders = folderPath.Split('\\');
FeedFolderData data = null;
foreach (string folderName in Folders) {
FeedFolderData folderData = new FeedFolderData();
folderData.Name = folderName;
if (data == null){
import.Folders.Add(folderData);
}else{
data.Folders = new List();
data.Folders.Add(folderData);
}
data = folderData;
}
foreach (IFeed feed in (IFeedsEnum)exportFolder.Feeds) {
ExportFeed(feed, data);
}
foreach (IFeedFolder folder in (IFeedsEnum)exportFolder.Subfolders) {
ExportFeedFolder(folder, data);
}
return import;
}
private void ExportFeed(IFeed feed, FeedFolderData folderData) {
if (folderData.Feeds == null) {
folderData.Feeds = new List();
}
FeedData data = new FeedData();
data.Name = feed.name;
data.Url = feed.url;
folderData.Feeds.Add(data);
}
private void ExportFeedFolder(IFeedFolder folder, FeedFolderData folderData) {
if (folderData.Folders == null) {
folderData.Folders = new List();
}
FeedFolderData current = new FeedFolderData();
current.Name = folder.name;
folderData.Folders.Add(current);
foreach (IFeedFolder subFolder in (IFeedsEnum)folder.Subfolders) {
ExportFeedFolder(subFolder, current);
}
foreach (IFeed feed in (IFeedsEnum)folder.Feeds) {
ExportFeed(feed, current);
}
}
private void ImportFeed(FeedData data, IFeedFolder folder){
if (!folder.ExistsFeed(data.Name)) {
folder.CreateFeed(data.Name, data.Url);
}
}
private void ImportFeedFolder(FeedFolderData data, IFeedFolder folder){
IFeedFolder importFolder;
if (folder.ExistsSubfolder(data.Name)) {
importFolder = (IFeedFolder)folder.GetSubfolder(data.Name);
} else {
importFolder = (IFeedFolder)folder.CreateSubfolder(data.Name);
}
if (data.Feeds != null) {
foreach (FeedData feedData in data.Feeds) {
ImportFeed(feedData, importFolder);
}
}
if (data.Folders != null) {
foreach (FeedFolderData folderData in data.Folders) {
ImportFeedFolder(folderData, importFolder);
}
}
}
}
}
Really simple, but a very handy class. Next time I will create a form to view, import and export the Common Feed List and show how to use the FeedEnclosure.AsyncDownload and FeedEnclosure.CancelAsyncDownload, so stay tuned. At that time I will include the complete sample code.