使用metablog迁移博客园的文章

有时候我们希望能将自己所有博客园的文章迁移到其他的博客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);
                            }
                            ));
                        }

posted @ 2010-07-02 16:44  彷徨......  阅读(272)  评论(0编辑  收藏  举报