从数据库中的URL生成站点地图

时间:2010-10-20 09:11:12

标签: c# asp.net url sitemap

问题陈述:

网址存储在数据库中,例如:

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

等等。

我想将上面的网址安排成树形,如下所示(每个项目都是一个网址链接)。最终输出将是一个简单的HTML列表(加上任何子列表)

因此:

home         gallery           info
  page1         image1           IT
  page2         image2            contact
  page3                           map

编程语言是C#,平台是asp.net

编辑1:

在上面的示例中,我们最终得到了三个列表,因为在我们的示例中有三个主要的'组',例如:home,gallery,info。

当然,这可以改变,算法需要能够以某种方式递归地构建列表..

2 个答案:

答案 0 :(得分:0)

好吧,排序这些字符串需要做很多工作,我已经做了类似你的工作。我希望与你分享这个策略。

首先,(如果你确实可以改变你的桌子的设计)
创建一个表格URL,如下所示

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

它是同一个表中类别和子类别的实现。以类似的方式,您可以包含插入大量页面和子页面。例如,

-------------------------------------
|  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 null 时,则为其最高级别 当 ParentID ID 时,它是该ID上任何级别的子级别等等......

从C#方面,您知道ParentID为空的首页 您可以通过首页的选定ID来显示它们的子页面。这是一些ADO.NET工作。

希望这会有所帮助 迈拉

答案 1 :(得分:0)

好的,做到了:

首先创建了一个类:

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

然后通过直接转换urls字符串生成SiteMap,如下所示:

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

无论如何它没有优化,我相信我可以清理它..