2016-10-28 8 views
1

"BookmarksManager.Chrome"(NuGetパッケージ)を使用したいと思います。 ChromeBookmarkReader.Readでブックマークを読むことができました。しかし、ブックマーク構造をツリーに表示する必要があり、ブックマークidとparentidを取得する方法が見つかりませんでした。 誰でもこれを行う方法を知っていますか? ChromeBookmarkModelにすべての情報が含まれているようです。しかし、それを使用する方法? ... ChromeBookmarkModelにBookmarkManager.Chromeを使用してブックマーク階層を取得する方法は?

敬具をBookmarkFolderを変換する方法は、トム

答えて

0

私が代わりにBookmarksManagerのnugetのHtml Agility Packを使用することをお勧めしていません。 私はあなたと同じことを達成しようとしましたが、BookmarksManagerナゲットを使用して運がなかった。幸いにも、私は、Html Agility Packを使用してフォルダ階層を表示する方法を見つけることができました。確かに私のソリューションはWPF用ですが、WinFormsに書き直すのは大したことではないと確信しています。有効なXMLであることからファイルを防ぐため、すべてのタグを削除し、したがって、正しく構造を読んでから私たちを防ぐために

1. Htmlの敏捷性パック:

public void OpenBookmarksFile() 
    { 
     string BookmarksFile_w_impeding_tags = @"your_bookmarks_file.html"; 
     BuildTree(treeView, XDocument.Load(Path.Combine(Directory.GetCurrentDirectory(), (DeleteTags(BookmarksFile_w_impeding_tags))))); 
    } 

    public string DeleteTags(string BookmarksFile_w_impeding_tags) 
    { 
     StreamReader BookmarkDatei = new StreamReader(BookmarksFile_w_impeding_tags); 
     string inhalt = BookmarkDatei.ReadToEnd(); 
     BookmarkDatei.Close(); 
     HtmlDocument doc_lessTags = new HtmlDocument(); 

     //deletes all DD Tags 
     string DD = "(<DD>[a-zA-Z0-9]+[^<]+)"; //Regex-Pattern 
     doc_lessTags.LoadHtml(Regex.Replace(inhalt, DD, "")); 

     //variable for each tag that could be impeding for displaying the correct hierarchy 
     var metas = doc_lessTags.DocumentNode.SelectNodes("//meta"); 
     var titles = doc_lessTags.DocumentNode.SelectNodes("//title"); 
     var h1s = doc_lessTags.DocumentNode.SelectNodes("//h1"); 
     var dts = doc_lessTags.DocumentNode.SelectNodes("//dt"); 
     var ps = doc_lessTags.DocumentNode.SelectNodes("//p"); 
     var hrs = doc_lessTags.DocumentNode.SelectNodes("//hr"); 
     var dds = doc_lessTags.DocumentNode.SelectNodes("//dd"); 
     var aa = doc_lessTags.DocumentNode.SelectNodes("//a"); 
     var h3s = doc_lessTags.DocumentNode.SelectNodes("//h3"); 

     //delete all tags that could be impeding (comments too) 
     //------------------------------------------------------------------------------------------------------------------------ 
     var doctype = doc_lessTags.DocumentNode.SelectSingleNode("/comment()[starts-with(.,'<!DOCTYPE')]"); 
     if (doctype != null) 
     { 
      doctype.Remove(); 
     } 
     //------------------------------------------------------------------------------------------------------------------------ 
     var comments = doc_lessTags.DocumentNode.SelectSingleNode("//comment()"); 
     if (comments != null) 
     { 
      comments.Remove(); 
     } 
     //------------------------------------------------------------------------------------------------------------------------ 
     foreach (var meta in metas) 
     { 
      meta.Remove(); 
     } 
     //------------------------------------------------------------------------------------------------------------------------ 
     foreach (var title in titles) 
     { 
      title.Remove(); 
     } 
     //------------------------------------------------------------------------------------------------------------------------ 
     foreach (var h1 in h1s) 
     { 
      h1.Remove(); 
     } 
     //-----some(open tags, like DT) can not be deleted the normal way becaue they would reverse the order of our file------ 
     if (dts != null) 
     { 
      foreach (var dt in dts) 
      { 
       if (!dt.HasChildNodes) 
       { 
        dt.ParentNode.RemoveChild(dt); 
        continue; 
       } 

       for (var i = dt.ChildNodes.Count - 1; i >= 0; i--) 
       { 
        var child = dt.ChildNodes[i]; 
        dt.ParentNode.InsertAfter(child, dt); 
       } 
       dt.ParentNode.RemoveChild(dt); 
      } 
     } 
     //-------------------------------------------------------------------------------------------------------------------------------------- 
     if (ps != null) 
     { 
      foreach (var p in ps) 
      { 
       if (!p.HasChildNodes) 
       { 
        p.ParentNode.RemoveChild(p); 
        continue; 
       } 

       for (var i = p.ChildNodes.Count - 1; i >= 0; i--) 
       { 
        var child = p.ChildNodes[i]; 
        p.ParentNode.InsertAfter(child, p); 
       } 
       p.ParentNode.RemoveChild(p); 
      } 
     } 
     //-------------------------------------------------------------------------------------------------------------------------------------- 
     if (hrs != null) 
     { 
      foreach (var hr in hrs) 
      { 
       if (!hr.HasChildNodes) 
       { 
        hr.ParentNode.RemoveChild(hr); 
        continue; 
       } 

       for (var i = hr.ChildNodes.Count - 1; i >= 0; i--) 
       { 
        var child = hr.ChildNodes[i]; 
        hr.ParentNode.InsertAfter(child, hr); 
       } 
       hr.ParentNode.RemoveChild(hr); 
      } 
     } 
     //-------------------------------------------------------------------------------------------------------------------------------------- 
     if (dds != null) 
     { 
      foreach (var dd in dds) 
      { 
       if (!dd.HasChildNodes) 
       { 
        dd.ParentNode.RemoveChild(dd); 
        continue; 
       } 

       for (var i = dd.ChildNodes.Count - 1; i >= 0; i--) 
       { 
        var child = dd.ChildNodes[i]; 
        dd.ParentNode.InsertAfter(child, dd); 
       } 
       dd.ParentNode.RemoveChild(dd); 
      } 
     } 
     //------------------------------------------------------------------------------------------------------------------------ 

     //system partition 
     string sysPart = System.IO.Path.GetPathRoot(Environment.SystemDirectory); 
     //currently logged in user 
     string userName = Environment.UserName; 


     //after deleting all impeding tags we save the result to a new file so that we can keep our original file untouched 
     string BookmarksFile_less_tags = [email protected]"{sysPart}Users\{userName}\Desktop\bookmarks_less_tags"; 
     doc_lessTags.Save(BookmarksFile_less_tags); 

     return BookmarksFile_less_tags; 
    } 

2.新しく作成されたファイルを使用しますSystem.Xmlを使用します。およびSystem.Xml.Linq;ツリービューを移入する

public void BuildTree(TreeView treeView, XDocument doc) 
    { 
     TreeViewItem treeNode = new TreeViewItem 
     { 
      //Should be Root 
      Header = doc.Root.Name.LocalName, 
      IsExpanded = true 
     }; 
     treeView.Items.Add(treeNode); 
     BuildNodes(treeNode, doc.Root); 
    } 

    public void BuildNodes(TreeViewItem treeNode, XElement element) 
    { 
     foreach (XNode child in element.Nodes()) 
     { 
      switch (child.NodeType) 
      { 
       case XmlNodeType.Element: 
        XElement childElement = child as XElement; 
        XElement prev = child.PreviousNode as XElement; 
        if(childElement.Name == "dl" && prev.Name == "h3") 
        { 

         TreeViewItem childTreeNode = new TreeViewItem 
         { 
          //because only the dl nodes have child nodes we want 
          //to display the dl nodes with the inner text of thier respective previous node 
          Header = prev.Value 
         }; 

         treeNode.Items.Add(childTreeNode); 
         BuildNodes(childTreeNode, childElement); 
        } 
        break; 
       case XmlNodeType.Text: 
        XText childText = child as XText; 
        treeNode.Items.Add(new TreeViewItem { Header = childText.Value, }); 
        break; 
      } 
     } 
    } 

if you don't add any icons it will look something like this..

関連する問題