Создать файл Sitemap из URL-адресов в базе данных - PullRequest
0 голосов
/ 20 октября 2010

Описание проблемы:

URL-адреса хранятся в базе данных, например:

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

и т. Д.

Я хотел бырасположите вышеупомянутые URL-адреса в древовидную структуру, как показано ниже (каждый элемент будет URL-ссылкой).Конечным результатом будет простой список HTML (плюс любой подсписок)

, таким образом:

home         gallery           info
  page1         image1           IT
  page2         image2            contact
  page3                           map

Язык программирования - C #, платформа - asp.net

РЕДАКТИРОВАТЬ 1:

В приведенном выше примере мы получаем Три Списка, потому что в нашем примере есть три основных «группы», например: home, gallery,info.

Естественно, это может измениться, алгоритм должен быть способен каким-то образом рекурсивно строить списки ..

Ответы [ 2 ]

0 голосов
/ 28 октября 2010

хорошо, сделал это:

Сначала создал класс:

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

, затем сгенерировал SiteMap, преобразовав строки 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 голосов
/ 20 октября 2010

Ну, сортировка этих строк требует много работы, я сделал что-то похожее на ваше состояние. Я хочу поделиться стратегией с вами.

Прежде всего, (если вы можете изменить дизайнваши столы действительно)Создайте 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 , тогда это подуровень любого уровня для этого идентификатора и т. д. ...

Со стороны C # вы знаете верхние страницы, гдеParentID являются нулевыми.Вы можете принести их подстраницы по выбранным идентификаторам верхних страниц. Это некоторая работа ADO.NET.

Надеюсь, это поможетMyra

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...