Chrome书签导入IE或Maxthon的程序(三)

本文介绍了一种使用正则表达式将Chrome浏览器书签转换为IE浏览器收藏夹格式的方法,并提供了完整的C#实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 上一篇介绍了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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值