我有这个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>");
}
}
}
答案 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)
根据我看到的情况,如果没有included
和skipUL
标记,您应该没问题。该算法很简单:
<li>
<ul>
</ul>
</li>
no 需要任何特殊处理。不需要额外的变量。