有时候我们希望能将自己所有博客园的文章迁移到其他的博客site,大家可能最先想到的就是metablog,没错,只有它了。
首先搜索了一下,很容易搜到老赵这篇文章 "一次批量修改博客文章的经验". 我个人不懂F#,也不太喜欢老赵的做法,就重新考虑了一下。
和老赵有一样的问题, metaBlog的API中的getRecentPosts并无法取得所有的文章,而且速度极慢,中间不能实现异步,无法看到即时结果。 后来无意发现将博客园所有文章备份后所生成的xml中其实已经包含了所有的文章id,这是个好兆头。
接下来工作就简单了,分析该xml文件,取得所有文章id,然后调用getPost分别取每篇文章的内容,然后迁移到其他的博客地址,这样就可以即时看到每一篇的迁移结果了。
下边是其中主要代码
XmlDocument docment = new XmlDocument();
docment.Load("c:\\blogMigr\\CNBlogs_BlogBackup_1_200606_201006 - Copy.xml");
XmlNodeList list = docment.SelectNodes("/rss/channel/item");
int nCount = 0;
foreach (XmlNode item in list)
{
nCount++;
string link = item.SelectSingleNode("link").InnerText;
string postId = link.Substring(link.LastIndexOf('/') + 1);
postId = postId.Substring(0, postId.IndexOf('.'));
Post postOld = oldSpace.getPost(postId, oldUsername, newPassword);
if ("" == postOld.title)
{
Console.WriteLine("Maybe this is a draft!");
oldSpace.deletePost(String.Empty, "" + postOld.postid, oldUsername, oldPassword, true);
Console.WriteLine("Delete draft from old Space, OK!");
continue;
}
Post postNew = new Post();
postNew.title = postOld.title;
postNew.dateCreated = postOld.dateCreated;
postNew.categories = postOld.categories;
postNew.description = postOld.description;
string newId = newSpace.newPost("Myblog", newUsername, newPassword, postNew, true);
lblStatus.Invoke(new processLable(delegate()
{
lblStatus.Text = string.Format("The application have processed {0} postes. {1}", nCount, postNew.title);
}
));
}