在C#中生成算法以获取层次结构数据以生成此html

时间:2011-03-28 17:28:28

标签: c# recursion

我有这个html作为参考,我有一组层次结构数据。希望节点的名称有助于理解它们在链中的位置

这里是参考html(硬编码)

 <ul id="tree1">
      <li><input type="checkbox"><label>Node 1</label>
       <ul>
        <li><input type="checkbox"><label>Node 1.1</label>
              <ul>
                     <li><input type="checkbox"><label>Node 1.1.1</label>
              </ul>
      </ul>
         <ul>
           <li><input type="checkbox"><label>Node 1.2</label>
              <ul>
                 <li><input type="checkbox"><label>Node 1.2.1</label>
                 <li><input type="checkbox"><label>Node 1.2.2</label>
                 <ul>
                         <li><input type="checkbox"><label>Node 1.2.3.1</label>             <li><input type="checkbox"><label>Node 1.2.3.2</label>
                </ul>
                    <li><input type="checkbox"><label>Node 1.2.4</label>
                    <li><input type="checkbox"><label>Node 1.2.5</label>
                    <li><input type="checkbox"><label>Node 1.2.6</label>
                </ul>
        </ul>
    <li><input type="checkbox"><label>Node 2</label>

我现在需要C#代码来获取此数据层次结构以生成上面的html输出。我有一个 Node 对象,它有一个。 Children ()属性。这是我到目前为止,但我在这段代码中遗漏了一些</ul>

注意:_b是一个字符串构建器对象,最后用于输出字符串。

   static public void GenerateTree(Node node, bool skipUL)
    {
        if (node.Children.Count() > 0)
        {
            bool included = false;
            foreach (Node childNode in node.Children)
            {
                if (!included && !skipUL)
                {
                    _b.AppendLine("<ul>");
                    included = true;
                }
                skipUL = false;
                _b.AppendLine("<li><input type='checkbox'>" + childNode .Name);
                GenerateTree(childNode, skipUL);
            }
            if (included)
            {
                _b.AppendLine("</ul>");
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

我会采取一些不同的方法,即从集合开始而不是单个实体(因为很可能你的root将成为一个集合,除非总是只有一个根元素)。

话虽如此:

    public static String Dump(List<Node> nodes)
    {
            if (nodes == null || nodes.Count == 0)
                    return String.Empty;

            StringBuilder sb = new StringBuilder("<ul>");
            foreach (var n in nodes)
            {
                    sb.AppendFormat("<li>{0}", n.Name);
                    sb.Append(Dump(n.Children));
                    sb.Append("</li>");
            }
            sb.Append("</ul>");

            return sb.ToString();
    }

这是一个演示,简单模拟了我希望你的对象看起来像:

<强> DEMO

答案 1 :(得分:0)

根据我看到的情况,如果没有includedskipUL标记,您应该没问题。该算法很简单:

  • 对于每个节点:
    • 输出<li>
    • 输出节点名称
    • 如果有孩子的话
      • 输出<ul>
      • 递归输出孩子
      • 输出</ul>
    • 输出</li>

no 需要任何特殊处理。不需要额外的变量。