c#
  • html
  • treeview
  • html-agility-pack
  • 2012-07-09 46 views 0 likes 
    0

    使用HTMLAgilityPack + TreeView創建HTML文件的層次結構GUI。這個HTML文件是由CMS生成的,並不是很好地生成的。.html文件> HTMLAgilityPack> TreeView層次

    需要做以下操作: 1.將每個大綱級別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.閱讀大綱級別1的節點作爲各自大綱級別的兒童0節點 注:每個大綱級別0點(上下浮動幾個是不是這個問題很重要)是奠定了作爲<li><object><param /></object>(注意缺少關閉</li>標籤)。需要出現兒童在TreeView將是一個無序列表<ul>是0級節點的<li>標籤的下一個兄弟節點,例如:

    <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; 
         } 
    

    的-level誰能給我一個手加載「孩子」(大綱級別1)節點到TreeView中所需的代碼? (ADDNODE(zeroLevelNode,TNODE)

    回答

    2

    像這樣的事情?

    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); 
        } 
    } 
    
    +0

    可能..你可以爲每行一個簡短的評論,所以我可以更好地理解它是如何工作的?我結束了使用中途到達那裏「parent :: li/child :: ul/descendant :: object」作爲節點集合選擇器,但是我需要考慮很多條件並且代碼看起來很乾淨:) – Techknowfile 2012-07-09 20:37:47

    +0

    它是一個遞歸函數('LoadTree' ),在每一級找到子節點,將它們添加到樹中的當前節點('treeNode',它是0級的根節點),並遞歸地繼續與子節點相同的進程。我不知道如何更清楚地解釋它:( – 2012-07-09 20:49:51

    相關問題