如何在xml树中记录两个节点之间的路径
本文关键字:两个 节点 之间 路径 xml 记录 | 更新日期: 2023-09-27 18:29:21
我希望能够记录从xml树中的某个节点到另一个节点所需的路径。用这个图代替XML树:
A
/ '
B C - D
/ / '
E F G
例如,如果我想记录从D到E的路径,路径会是向上到父C,向上到母A,向下到子B,再向下到子E。所以,可能实际记录的路径是节点D->节点C->节点A->节点B->节点E。我怎么能记录这样的路径呢?
基本上,您希望创建从每个节点到根的路径。然后比较从根开始的两个路径中的节点,找到最后一个匹配项。这是共同的祖先。这样,您就可以截断每个路径,然后将它们连接在一起。
public static string CreatePath(XElement from, XElement to)
{
var fromToRoot = from.PathToRoot();
var rootToTo = to.PathToRoot().Reverse();
var commonAncestor = rootToTo.Zip(fromToRoot.Reverse(), Tuple.Create)
.TakeWhile(nodes => nodes.Item1 == nodes.Item2)
.Select(nodes => nodes.Item1)
.LastOrDefault();
if (commonAncestor == null) return "Not connected";
return string.Join(
"->",
fromToRoot.TakeWhile(node => node != commonAncestor)
.Concat(rootToTo.SkipWhile(node => node != commonAncestor))
.Select(n => n.Name));
}
public static IEnumerable<XElement> PathToRoot(this XElement from)
{
yield return from;
var fromParent = from.Parent;
while (fromParent != null)
{
yield return fromParent;
fromParent = fromParent.Parent;
}
}