背景与问题介绍
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);
}
}
输出结果如下:
完整代码地址:Github