私が代わりに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..