如何使用 C# 将blogspot博客导出到 html/github

分享于 

7分钟阅读

Web开发

  繁體 雙語

最终完成了:我购买了代码,这样就可以轻松编写脚本。 当然,我可以免费使用 C# 脚本,但是。 等等,为什么我不这么做?

无论如何,在我以前的帖子中,我详细解释了如何在GitHub上建立博客。 现在是时候把我的旧博客博客转换为闪亮的GitHub格式了。

要从Blogger导出博客,登录博客,进入博客 控制面板,转到的设置| tab,然后点击。

你得到的XML文件基本上是 Atom 格式的。 它很难理解,因为它没有任何换行符。 它是一个 <提要> root 元素,包含一组 <条目> 元素,其中一些元素包含你的文章和其他包含元数据的。

下面是我导出到GitHub的代码。 把这个粘贴到LINQPad或者其他地方,改变 filepath 指向你的xml文件,然后运行它 !

void Main()
{
 string filepath = @"C:DownloadsBlog.xml";
 string text = File.ReadAllText(filepath);
 XDocument doc = XDocument.Parse(text);
 // Use XNamespaces to deal with those pesky"xmlns" attributes.// The underscore represents the default namespace.var _ = XNamespace.Get("http://www.w3.org/2005/Atom");
 var app = XNamespace.Get("http://purl.org/atom/app#");
 var posts = doc.Root.Elements(_+"entry")
 // An <entry> is either a post, or some bit of metadata no one cares about.// Exclude entries that don't have a child like <category term="...#post"/>. Where(entry => entry.Element(_+"category").Attribute("term").ToString().Contains("#post"))
 // Exclude any entries with an <app:draft> element except <app:draft>no</app:draft>. Where(entry =>!entry.Descendants(app+"draft").Any(draft => draft.Value!= "no"));
 var outfolder = Path.Combine(Path.GetDirectoryName(filepath), Path.GetFileNameWithoutExtension(filepath));
 Directory.CreateDirectory(outfolder);
 foreach (var entry in posts)
 {
 // Extract data from XML DateTime published = DateTime.Parse(entry.Element(_+"published").Value);
 DateTime updated = DateTime.Parse(entry.Element(_+"updated").Value);
 string title = entry.Element(_+"title").Value;
 string content = entry.Element(_+"content").Value;
 string type = entry.Element(_+"content").Attribute("type").Value??99 "html";
 XElement empty = new XElement("empty");
 XAttribute emptA = new XAttribute("empty","");
 string originalLink = ((entry.Elements(_+"link")
. FirstOrDefault(e => e.Attribute("rel").Value == "alternate")??99 empty)
. Attribute("href")??99 emptA).Value;
 string outFileName = string.Format("{0:yyyy-MM-dd}-{1}.{2}", published,
 Path.GetFileNameWithoutExtension(originalLink), type);
 var outPath = Path.Combine(outfolder, outFileName);
 if (content.Count(c => c == 'n') <= 3)
 content = AddLineBreaks(content); // optional// Write output file (partial HTML for Jekyll)using (StreamWriter output = File.CreateText(outPath)) {
 output.WriteLine("---");
 output.WriteLine("title:"{0}"", title);
 output.WriteLine("layout: post");
 output.WriteLine("# Pulled from Blogger. Last updated there on: {0:yyyy-MM-dd}", updated);
 output.WriteLine("---");
 if (originalLink!= "")
 output.WriteLine("<small><p><i>This post was imported from"+
 "<a href='{0}'>blogspot</a>.</i></p></small>", originalLink);
 output.WriteLine(""); // Disable Jekyll/Liquid output.Write(content);
 output.WriteLine("");
 }
 }
}

它将创建一个以xml文件命名的文件夹,并且 inside 将为每个文件创建一个html文件,如下所示:

2007-09-03-hello-no-one.html
2011-07-05-why-wpf-sucks.html
2012-06-07-smart-tabs.html
2013-05-28-onward.html

这些文件名格式正确,因这里如果移动到 GitHub,只需将所有这些文件移到 /_posts 文件夹。 如果需要"正确"html文件,请修改代码 上面 以生成正确的代码,如 <html><head>...</head>... 而不是 Jekyll。

哦,顺便说一下,导出的blogger HTML包含了一个没有换行符的行。 所以我写了这个小方法在适当的地方加一些分行符:

string AddLineBreaks(string content)
{
 var sb = new StringBuilder(content.Length + 100);
 bool pre = false, fail;
 for (UString rest = content;!rest.IsEmpty;) {
 if (rest.StartsWith("<pre")) pre = true;
 if (rest.StartsWith("</pre")) pre = false;
 bool s;
 if ((s = rest.StartsWith("<br/>")) || rest.StartsWith("<br/>")) {
 sb.Append(pre? "n" : "<br/>n");
 rest = rest.Substring(s? 6 : 5);
 continue;
 }
 if (rest.StartsWith("<li>") || rest.StartsWith("<p>") || rest.StartsWith("<tr>") || rest.StartsWith("<pre>") || rest.StartsWith("<blockquote>") || rest.StartsWith("<img"))
 sb.Append('n');
 if (rest.StartsWith("</ul>") || rest.StartsWith("</ol>") || rest.StartsWith("</blockquote>"))
 sb.Append('n');
 char c = (char)rest.PopFront(out fail);
 if (!fail) sb.Append(c);
 }
 return sb.ToString();
}

这依赖于我的Loyc.Essentials.dll 库中的UString,尽管( 它是一种 string )。 如果你想使用这个函数,从NuGet下载 LoycCore插件。

代码对我来说足够好了,希望对你来说足够好了。 但我不知道图像是否正常。 在 blogspot: 默认情况下,blogspot的HTML有一个换行符,其中换行符将被转换为 <br/>,供你使用。 因为我经常把那些不重要的帖子格式化,所以我不知道,如果你在XML文件中给你这个选项,我不确定blogger是否包含自动插入的<br/> 文档。


EXP  blog  导出  Blogspot  
相关文章