如何在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。我怎么能记录这样的路径呢?

如何在xml树中记录两个节点之间的路径

基本上,您希望创建从每个节点到根的路径。然后比较从根开始的两个路径中的节点,找到最后一个匹配项。这是共同的祖先。这样,您就可以截断每个路径,然后将它们连接在一起。

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;
  }
}