[Algorithm] - C# - Join the xml nodes name by using backtracking

Posted by William Basics on Wednesday, November 3, 2021

背景与问题介绍

XML文件,大家都很熟悉了。其中的各个节点组成了一颗“树”。 比如

<A>
  <B>
    <C/>
  </B>
  <D>
    <E/>
  </D>
  <F>
    <G/>
  </F>
</A>

“客户”要求希望开发一个程序,来通过节点之间的树形关系得到以下结果

A
A\B
A\B\C
A\D
A\D\E
A\F
A\F\G

解决方案

.NET 中XML文件的解析,我们可以选用XDocument。我们通过XDocument的Load函数来载入XML文件流。

if (!File.Exists(xmlFile)) return;

using var fs = new FileStream(xmlFile, FileMode.Open);
var xmlDoc = XDocument.Load(fs);

然后我们就可以得到xml的root element。

var root = xmlDoc.Root;

接下来,我们用这个root来遍历整棵树。

var joinedStrs = new List<string>();
var paths = new List<string>() {root.Name.LocalName};

Traverse(root, paths, joinedStrs); 

Traverse函数使用了回溯算法来得到我们所需要的字符串组合。

private static void Traverse(XElement root, List<string> paths, List<string> joinedStrs)
{
    if (root == null) return;
    joinedStrs.Add(string.Join(@"\", paths));
    foreach (var sub in root.Elements())
    {
        paths.Add(sub.Name.LocalName);
        Traverse(sub, paths, joinedStrs);
        paths.RemoveAt(paths.Count-1);
    }
}

输出结果如下:

result

完整代码地址:Github