2010-10-20 46 views
0

問題陳述從網址生成網站地圖:在數據庫

URL存儲在數據庫中,例如:

home/page1 
gallery/image1 
info/IT/contact 
home/page2 
home/page3 
gallery/image2 
info/IT/map 

等。

我想安排上述的樹形結構如下圖所示(每個項目將是一個url鏈接)。最後的結果將是一個簡單的HTML列表(加上所有子列表(S))

這樣的:

home   gallery   info 
    page1   image1   IT 
    page2   image2   contact 
    page3       map 

的編程語言是C#,平臺是asp.net

編輯1:

在上面的例子中,我們以結尾三列表,因爲在我們的例子中有三個主要'組',例如:home,gallery,info。

當然,這可以改變,算法需要能夠以某種方式建立的名單遞歸..

回答

0

OK,做到了:

首先創建一個類:

public class Node 
{ 
    private string _Parent = string.Empty; 
    private string _Child = string.Empty; 
    private bool _IsRoot = false; 

    public string Parent 
    { 
     set { _Parent = value; } 
     get { return _Parent; } 
    } 

    public string Child 
    { 
     set { _Child = value; } 
     get { return _Child; } 
    } 

    public Node(string PChild, string PParent) 
    { 
     _Parent = PParent; 
     _Child = PChild; 
    } 

    public bool IsRoot 
    { 
     set { _IsRoot = value; } 
     get { return _IsRoot; } 
    } 
} 

然後生成網站地圖,直接轉換的URL字符串如下:

private static string MakeTree() 
    { 
     List<Node> __myTree = new List<Node>(); 

     List<string> urlRecords = new List<string>(); 
     urlRecords.Add("home/image1"); 
     urlRecords.Add("home/image2"); 
     urlRecords.Add("IT/contact/map"); 
     urlRecords.Add("IT/contact/address"); 
     urlRecords.Add("IT/jobs"); 

     __myTree = ExtractNode(urlRecords); 

     List<string> __roots = new List<string>(); 

     foreach(Node itm in __myTree) 
     { 
      if (itm.IsRoot) 
      { 
       __roots.Add(itm.Child.ToString()); 
      } 
     } 

     string __trees = string.Empty; 

     foreach (string roots in __roots) 
     { 
      __trees += GetChildren(roots, __myTree) + "<hr/>"; 
     } 


     return __trees; 
    } 

    private static string GetChildren(string PRoot, List<Node> PList) 
    { 
     string __res = string.Empty; 
     int __Idx = 0; 

     foreach (Node x in PList) 
     { 
      if (x.Parent.Equals(PRoot)) 
      { 
       __Idx += 1; 
      } 
     } 

     if (__Idx > 0) 
     { 
      string RootHeader = string.Empty; 

      foreach (Node x in PList) 
      { 
       if (x.IsRoot & PRoot == x.Child) 
       { 
        RootHeader = x.Child; 
       } 
      } 

      __res += RootHeader+ "<ul>\n"; 

      foreach (Node itm in PList) 
      { 
       if (itm.Parent.Equals(PRoot)) 
       { 
        __res += string.Format("<ul><li>{0}{1}</li></ul>\n", itm.Child, GetChildren(itm.Child, PList)); 
       } 
      } 
      __res += "</ul>\n"; 
      return __res; 
     } 
     return string.Empty; 
    } 

    private static List<Node> ExtractNode(List<string> Urls) 
    { 
     List<Node> __NodeList = new List<Node>(); 

     foreach (string itm in Urls) 
     { 
      string[] __arr = itm.Split('/'); 
      int __idx = -1; 

      foreach (string node in __arr) 
      { 
       __idx += 1; 
       if (__idx == 0) 
       { 
        Node __node = new Node(node, ""); 
        if (!__NodeList.Exists(x => x.Child == __node.Child & x.Parent == __node.Parent)) 
        { 
         __node.IsRoot = true; 
         __NodeList.Add(__node);  
        } 
       } 
       else 
       { 
        Node __node = new Node(node, __arr[__idx - 1].ToString()); 
        { 
         if (!__NodeList.Exists (x => x.Child == __node.Child & x.Parent == __node.Parent)) 
         { 
          __NodeList.Add(__node); 
         } 
        } 
       } 
      } 
     } 
     return __NodeList; 
    } 

無論如何,沒有優化,我確信我可以清理它很多..

0

好,整理這些字符串需要大量的工作,我已經做了類似的東西到你的condition.I希望與您分享策略。

首先,(如果你可以改變你的的確表的設計)
創建一個表網址,如下所示

---------------- 
| URL Table | 
---------------- 
| ID   | 
| ParentID | 
| Page  | 
|..extra info..| 
---------------- 

它的類別和子類在同一table.In實現類似的方式,你可以插入含有大量的頁面和subpage.For例如,

------------------------------------- 
| ID | ParentID | Page  | ... 
------------------------------------ 
| 0 |  null  | Home  | 
| 1 |  null  | Gallery | 
| 2 |  null  | Info  | 
| 3 |  0  | Page1 | 
| 4 |  0  | Page2 | 
| 5 |  0  | Page3 | ... 
| 6 |  1  | Image1 | 
| 7 |  1  | Image2 | 
| 8 |  2  |  IT  | 
| 9 |  8  | contact | 
| 1 |  8  |  map  | 
------------------------------------- ... 

PARENTID然後它的最高水平
PARENTID是和ID那麼它的任何級別上的ID等等...

從C#的一面,你知道在哪裏PARENTID的是空頂頁面的分段。
您可以通過選定的頂級頁面的ID將它們的子頁面。它是一些ADO.NET的工作。

希望這有助於
邁拉

+0

非常感謝,您推動我朝着正確的方向前進。 – Darknight 2010-10-27 23:01:18