.html> HTMLAgilityPack> Иерархия TreeView

c# html html-agility-pack treeview

Вопрос

Использование HTMLAgilityPack + TreeView для создания графического интерфейса иерархии HTML-файла. HTML-файл сгенерирован CMS и не очень хорошо сгенерирован.

Необходимо выполнить следующие действия: 1. Прочтите каждый узел Outline Level 0 в TreeView.

HtmlNodeCollection ZeroLevelNodes = doc.DocumentNode.SelectNodes("//body/object[@type='text/sitemap']|//body/ul/object[@type='text/sitemap']|//body/ul/li/object[@type='text/sitemap']");

2. Прочитайте узлы Outline Level 1 как дочерние узлы их соответствующих уровней Outline Level 0. Примечание. Каждый узел Outline Level 0 (минус несколько, которые не важны для этого вопроса) выкладывается как <li><object><param /></object> (обратите внимание на отсутствие закрывающего </li> ). Узлы, которые должны отображаться в виде дочерних элементов в TreeView, будут в неупорядоченном списке <ul> который является следующим дочерним элементом тега <li> уровня 0, например:

<ul>
    <li>
        <object>
            <param name="**exampleLevel0**" value="**example.htm**" /> //value example.htm as the text in the level 0 node.
        </object>
    <ul>
        <li>
            <object>
               <param name="**ExampleLevel1**" value="childnode.htm" /> //childnode.htm as the text in the level 1 child node.
            </object>
        <li>
            <object>
               <param name="**ExampleLevel1_2**" value="childnode2.htm" /> //childnode2.htm as the text in the level 1 child node.
            </object>
    </ul>
 </ul>

Вот мой текущий код для генерации иерархии верхнего уровня

HtmlNodeCollection tocNodes = doc.DocumentNode.SelectNodes("//body/object[@type='text/sitemap']|//body/ul/object[@type='text/sitemap']|//body/ul/li/object[@type='text/sitemap']");
foreach (HtmlNode zeroLevelNode in zeroLevelNodes)
        {

            TreeNode tNode = new TreeNode();
            HtmlNode paramNode = zeroLevelNode.SelectSingleNode("param[@name]");
            string paramName = paramNode.GetAttributeValue("name", null);
            string paramValue = paramNode.GetAttributeValue("value", null);
            TreeView.Nodes.Add(new TreeNode(paramValue));
            tNode = TreeView.Nodes[i];
            AddNode(zeroLevelNode, tNode);
            i += 1;
        }

Может ли кто-нибудь дать мне руку с кодом, необходимым для загрузки узлов «детей» (контур уровня 1) в TreeView? (AddNode (zeroLevelNode, tNode)

Популярные ответы

Что-то вроде этого?

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
TreeNode root = new TreeNode("HTML");
treeView1.Nodes.Add(root);

LoadTree(root, doc.DocumentNode);


void LoadTree(TreeNode treeNode, HtmlAgilityPack.HtmlNode rootNode)
{
    foreach (var node in rootNode.ChildNodes.Where(n=>n.Name!="#text"))
    {
        TreeNode n = new TreeNode(node.Name);
        node.Attributes.Select(a => a.Name + "=" + a.Value)
                       .ToList()
                       .ForEach(x => n.Nodes.Add(x));
        treeNode.Nodes.Add(n);

        LoadTree(n, node);
    }
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow