Chrome書籤導入IE或Maxthon的程序(三)

 上一篇介紹了Chrome書籤和IE收藏夾文件的格式對應,需要先將Chrome書籤文件格式轉換爲XML方便操作。本篇就將如何進行這種轉換。

考慮到文件轉換效率,一行行讀取後判斷在轉換的方式固然是最簡單思路最清晰地,但是效率恐怕是最低下的。如果遇到收藏加層次很多文件很多的情況就很慢,因此我們選擇用正則表達式替換方式對全文依次按照指定模式替換相應內容,最後生成需要的XML文件。

這裏列出我在程序中使用的正則表達式:

"//s*/"other/".*//n.*//n.*// {"

".*//n//s*/"date_added/".*//n.*//n.*//n.*//n.*//n.*//n.*//n.*////u5176////u4ED6////u4E66////u7B7E.*//n.*"

//s*/"roots/"://s// {"

"//s*/"bookmark_bar/"://s// {"

"//s*/"children/"://s//[//s// {"

"//s*/"date_added/"://s/"(.*)/ ","

"//s*/"name/"://s/"(.*)/ ","

"//s*/"type/"://s/"(.*)/ ""

"//s*/"url/"://s/"(.*)/ ""

"//s*/"date_modified/"://s/"(.*)/ ","

"//s*/"other/"://s// {"

"//],"

"//{|// }|,"

"//s*/"version/"://s1 "

"(////u ....)"

對照源程序可以看得懂是用來替換什麼部分的。值得一提的是在C#的正則表達式替換部分增加一個處理事件,可以同事將Unicode編碼的名字轉換爲中文。

  1. private   string  Unicode2GB(Match regmatch)
  2.     {
  3.        string  dst =  "" ;
  4.        string  src = regmatch.Value;
  5.        string  str =  "" ;
  6.       str = src.Substring(2);
  7.        byte [] bytes =  new   byte [2];
  8.       bytes[1] =  byte .Parse( int .Parse(str.Substring(0, 2), NumberStyles.HexNumber).ToString());
  9.       bytes[0] =  byte .Parse( int .Parse(str.Substring(2, 2), NumberStyles.HexNumber).ToString());
  10.       dst = Encoding.Unicode.GetString(bytes);
  11.        return  dst;
  12.     }

最後就是導出XML格式爲IE可用的收藏夾了,這部分簡單,一個遞歸函數分析XML中的標記,然後在給定的路徑創建文件夾或.url文件即可。

 

最後貼出所有的源碼,大家可以參考改進,祝大家順利!

  1. using  System;
  2. using  System.Collections.Generic;
  3. using  System.ComponentModel;
  4. using  System.Data;
  5. using  System.Drawing;
  6. using  System.Text;
  7. using  System.Windows.Forms;
  8. using  System.IO;
  9. using  System.Text.RegularExpressions;
  10. using  System.Globalization;
  11. using  System.Xml;
  12. namespace  BookmarksTrans
  13. {
  14.    public  partial  class  Form1 : Form
  15.   {
  16.      public  Form1()
  17.     {
  18.       InitializeComponent();
  19.     }
  20.      private   void  button1_Click( object  sender, EventArgs e)
  21.     {
  22.       openFileDialog1.ShowDialog();
  23.        if  (openFileDialog1.FileName!=  "" )
  24.       {
  25.         txt_Chrome.Text = openFileDialog1.FileName;
  26.       }
  27.     }
  28.      private   void  DealBookMark( string  bookmarkFile)
  29.     {
  30.       XmlDocument xmlDoc =  new  XmlDocument();
  31.       XmlNode xmlBase;
  32.       XmlNodeList xmlURLlist;
  33.       StreamReader sdr =  new  StreamReader(bookmarkFile);
  34.       TreeNode tempNode =  new  TreeNode();
  35.        string  readData =  "" ;
  36.        try
  37.       {
  38.          // 處理Chrome收藏夾格式爲xml
  39.         readData = sdr.ReadToEnd();
  40.         readData = Regex.Replace(readData,  "//s*/"other/".*//n.*//n.*//{" "" );
  41.         readData = Regex.Replace(readData,
  42.                                   ".*//n//s*/"date_added/".*//n.*//n.*//n.*//n.*//n.*//n.*//n.*////u5176////u4ED6////u4E66////u7B7E.*//n.*" ,
  43.                                   "" );
  44.         readData = Regex.Replace(readData,  "&" "@" );
  45.         readData = Regex.Replace(readData,  "//s*/"roots/"://s//{" ,
  46.                                   "<?xml version=/"1.0/" encoding=/"GBK/" ?>" );
  47.         readData = Regex.Replace(readData,  "//s*/"bookmark_bar/"://s//{" "<bookmark>" );
  48.         readData = Regex.Replace(readData,  "//s*/"children/"://s//[//s//{" "<bookmarkchild>" );
  49.         readData = Regex.Replace(readData,  "//s*/"date_added/"://s/"(.*)/"," ,
  50.                                   "<date_added>$1</date_added>" );
  51.         readData = Regex.Replace(readData,  "//s*/"name/"://s/"(.*)/"," "<name>$1</name>" );
  52.         readData = Regex.Replace(readData,  "//s*/"type/"://s/"(.*)/"" "<type>$1</type>" );
  53.         readData = Regex.Replace(readData,  "//s*/"url/"://s/"(.*)/"" "<url>$1</url>" );
  54.         readData = Regex.Replace(readData,  "//s*/"date_modified/"://s/"(.*)/"," ,
  55.                                   "<date_modified>$1</date_modified>" );
  56.         readData = Regex.Replace(readData,  "//s*/"other/"://s//{" "<bookmarkchild>" );
  57.         readData = Regex.Replace(readData,  "//]," "</bookmarkchild>" );
  58.         readData = Regex.Replace(readData,  "//{|//}|," "" );
  59.         readData = Regex.Replace(readData,  "//s*/"version/"://s1" "</bookmark>" );
  60.         readData = Regex.Replace(readData,  "(////u....)" new  MatchEvaluator(Unicode2GB));
  61.          // 導出收藏夾
  62.         xmlDoc.LoadXml(readData);
  63.         xmlBase = xmlDoc.DocumentElement;
  64.         xmlURLlist = xmlBase.ChildNodes;
  65.         tempNode.Text =  "收藏夾" ;
  66.         trv_MarkbookList.Nodes.Add(tempNode);
  67.         AddBookMark(xmlURLlist,tempNode);
  68.       }
  69.        catch  (Exception ex)
  70.       {
  71.         MessageBox.Show( "書籤分析出錯:" +ex.Message,  "錯誤" , MessageBoxButtons.OK, MessageBoxIcon.Error);
  72.       }
  73.        finally
  74.       {
  75.         sdr.Close();
  76.         sdr.Dispose();
  77.       }
  78.     }
  79.      /// <summary>
  80.      /// Unicode編碼轉換爲漢字
  81.      /// </summary>
  82.      /// <param name="regmatch"></param>
  83.      /// <returns></returns>
  84.      private   string  Unicode2GB(Match regmatch)
  85.     {
  86.        string  dst =  "" ;
  87.        string  src = regmatch.Value;
  88.        string  str =  "" ;
  89.       str = src.Substring(2);
  90.        byte [] bytes =  new   byte [2];
  91.       bytes[1] =  byte .Parse( int .Parse(str.Substring(0, 2), NumberStyles.HexNumber).ToString());
  92.       bytes[0] =  byte .Parse( int .Parse(str.Substring(2, 2), NumberStyles.HexNumber).ToString());
  93.       dst = Encoding.Unicode.GetString(bytes);
  94.        return  dst;
  95.     }
  96.      /// <summary>
  97.      /// 將具有子欄目的書籤添加到TreeView中
  98.      /// </summary>
  99.      /// <param name="xmlList">子欄目</param>
  100.      private   void  AddBookMark(XmlNodeList xmlList,TreeNode parentNode)
  101.     {
  102.       TreeNode PNode = parentNode;
  103.        for  ( int  i = 0; i < xmlList.Count - 1; i++)
  104.       {
  105.          if  (xmlList[i].Name ==  "bookmarkchild" )
  106.         {
  107.           TreeNode sonNode =  new  TreeNode();
  108.            if  (xmlList[i+3].InnerText !=  "書籤欄" )
  109.           {
  110.             sonNode.Text = xmlList[i + 3].InnerText;
  111.             parentNode.Nodes.Add(sonNode);
  112.             PNode = sonNode;
  113.           }
  114.           AddBookMark(xmlList[i].ChildNodes, PNode);
  115.         }
  116.          else   if  (xmlList[i].Name ==  "type"  && xmlList[i].InnerText ==  "url" )
  117.         {
  118.            // 文件名非法字符處理
  119.            string  urlName=xmlList[i - 1].InnerText.Replace( "." , "." ).Replace( "//"," \");
  120.           urlName=urlName.Replace( "/" , "/" ).Replace( "<" , "<" );
  121.           urlName = urlName.Replace( ">" ">" ).Replace( "*" "*" ).Replace( "?" "?" );
  122.           urlName = urlName.Replace( ":" ":" ).Replace( "/"" """ ).Replace( "|" "|" );
  123.           TreeNode urlNode= new  TreeNode(urlName);
  124.           urlNode.Tag = xmlList[i + 1].InnerText;
  125.           parentNode.Nodes.Add(urlNode);
  126.         }
  127.       }
  128.     }
  129.      private   void  btn_DealChrome_Click( object  sender, EventArgs e)
  130.     {
  131.        if  (txt_Chrome.Text.Trim()== "" )
  132.       {
  133.         MessageBox.Show( "不給出Chrome書籤位置,我也幫不了你!" "不耐煩" );
  134.          return ;
  135.       }
  136.       DealBookMark(txt_Chrome.Text);
  137.     }
  138.      private   void  btn_InIE_Click( object  sender, EventArgs e)
  139.     {
  140.        string  iebookmarkPath =  "" ;
  141.        if  (txt_IEbookmark.Text!= "" )
  142.       {
  143.         iebookmarkPath = txt_IEbookmark.Text;       
  144.       }
  145.        else
  146.       {
  147.         iebookmarkPath = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
  148.       }
  149.       DirectoryInfo favorite = Directory.CreateDirectory(iebookmarkPath);
  150.       ExportBookMarks(trv_MarkbookList.Nodes,favorite);
  151.       MessageBox.Show( "成功完成書籤導出" );
  152.     }
  153.      /// <summary>
  154.      /// 導出書籤到指定文件夾
  155.      /// </summary>
  156.      /// <param name="folderpath"></param>
  157.      private   void  ExportBookMarks(TreeNodeCollection Nodes,DirectoryInfo foldInfo)
  158.     {
  159.        for  ( int  i = 0; i < Nodes.Count; i++)
  160.       {
  161.          if  (Nodes[i].Nodes.Count>0)
  162.         {
  163.           DirectoryInfo fold =foldInfo.CreateSubdirectory(Nodes[i].Text);
  164.           ExportBookMarks(Nodes[i].Nodes,fold);
  165.         }
  166.          else
  167.         {
  168.           FileStream fileSW = File.Open(foldInfo.FullName +  "//" + Nodes[i].Text + " .url",FileMode.Create);
  169.           StreamWriter stWriter =  new  StreamWriter(fileSW);
  170.            try
  171.           {
  172.             stWriter.WriteLine( "[InternetShortcut]" );
  173.             stWriter.WriteLine( "URL="  + Nodes[i].Tag.ToString());
  174.             stWriter.Flush();
  175.             
  176.           }
  177.            catch  (Exception ex)
  178.           {
  179.             MessageBox.Show( "導出書籤出錯:"  + ex.Message,  "錯誤" , MessageBoxButtons.OK, MessageBoxIcon.Error);
  180.           }
  181.            finally
  182.           {
  183.             stWriter.Close();
  184.             stWriter.Dispose();
  185.             fileSW.Close();
  186.             fileSW.Dispose();
  187.           }
  188.         }
  189.       }
  190.     }
  191.      private   void  btn_IE_Click( object  sender, EventArgs e)
  192.     {
  193.       folderBrowserDialog1.ShowDialog();
  194.        if  (folderBrowserDialog1.SelectedPath!= "" )
  195.       {
  196.         txt_IEbookmark.Text = folderBrowserDialog1.SelectedPath;
  197.       }
  198.     }
  199.   }
  200. }

附工程文件的下載鏈接:http://www.rayfile.com/files/27021328-b4b5-11dd-b869-0019d11a795f/

發佈了73 篇原創文章 · 獲贊 3 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章