迭代嵌套的XML节点

时间:2011-02-21 12:24:29

标签: c# xml

我已经阅读了相关的相关问题,但我觉得我并不喜欢它。如果我有一个包含许多节点和后续子节点的XML文档,如果我不知道子节点的深度,我该如何遍历文档呢?

这是一些可怕的代码来演示我的意思:

foreach (var section in xml.Sections.Keys)
{
    cont.ContentControls.Add(new Separator(xml.Sections[section].Name));
    foreach (var variable in xml.Sections[section].Variables)
    {
        TraverseVars(cont, xml.Sections[section].Name, variable.Value.Name, variable.Value.Title, variable.Value.Default1, variable.Value.Default2, variable.Value.Default3, variable.Value.DesignerType);
        i++;
    }
    if (xml.Sections[section].Sections.Count > 0)
    {
        foreach (var section2 in xml.Sections[section].Sections.Keys)
        {
            cont.ContentControls.Add(new Separator(xml.Sections[section].Sections[section2].Name));
            foreach (var variable2 in xml.Sections[section].Sections[section2].Variables)
            {
                TraverseVars(cont, xml.Sections[section].Name, variable2.Value.Name, variable2.Value.Title, variable2.Value.Default1, 
                            variable2.Value.Default2, variable2.Value.Default3, variable2.Value.DesignerType);
                i++;
            }
        }
    }
}

这里我只在有一个嵌套级别(“if ...... Count> 0”)时才提供服务。我知道有更好的方法来满足嵌套级别,但我看不到它。

2 个答案:

答案 0 :(得分:3)

您正在寻找的是recursion,或者是一个while循环,您可以在其中重新分配循环中使用的变量。


使用递归可能是最简单的,看看Bhavik Goyal的答案,它似乎是你的解决方案。

答案 1 :(得分:3)

为此你必须创建一个递归函数,它会自动调用它,直到嵌套的xml循环没有结束......

这是一个例子......

如果有任何错误,请修复......

public void xmlsection(XmlSection Section)
{
    cont.ContentControls.Add(new Separator(xml.Sections[section].Name));
    foreach (var variable in xml.Sections[section].Variables)
    {
        TraverseVars(cont, xml.Sections[section].Name, variable.Value.Name, variable.Value.Title, variable.Value.Default1, variable.Value.Default2, variable.Value.Default3, variable.Value.DesignerType);
        i++;
    }
    if (xml.Sections[section].Sections.Count > 0)
    {
        foreach (var section2 in xml.Sections[section].Sections.Keys)
        {
xmlsection(section2);
        }
    }

}