【问题标题】:Generate Sitemap from URLs in Database从数据库中的 URL 生成站点地图
【发布时间】:2010-10-20 09:11:12
【问题描述】:

问题陈述:

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:

在上面的示例中,我们最终得到 三个列表,因为在我们的示例中,有三个主要的“组”,例如:家庭、画廊、信息。

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

【问题讨论】:

    标签: c# asp.net url sitemap


    【解决方案1】:

    嗯,对这些字符串进行排序需要做很多工作,我做了一些与你的情况相似的事情。我希望与你分享策略。

    首先,(如果您确实可以更改表格的设计)
    创建一个如下所示的表格 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     |
    ------------------------------------- ...
    

    ParentIDnull 时,它的最高级别
    ParentIDID 时,它是该 ID 上任何级别的子级别,依此类推...

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

    希望这会有所帮助
    迈拉

    【讨论】:

      【解决方案2】:

      好的,做到了:

      首先创建了一个类:

       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 字符串生成 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;
          }
      

      反正它没有优化,我相信我可以清理很多..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多