尝试记录从 xml 根目录到指定节点的路径
本文关键字:节点 路径 根目录 记录 xml | 更新日期: 2023-09-27 18:30:16
我希望能够获取从xml文档的根节点到树中指定节点的路径。我现在有一个基本算法,但它不会删除不通向指定节点的节点(我想找到从根到该节点的最短路径)。
private static List<string> firstPath = new List<string>();
private static XmlDocument doc = new XmlDocument();
private static bool run = true;
static void Main(string[] args)
{
doc.Load("XML doc name");
foreach(XmlNode node in doc.ChildNodes)
{
path("Specified node you want the path to", node);
}
printPath(firstPath);
}
private static void path(string name, XmlNode node)
{
foreach(XmlNode childNode in node.ChildNodes)
{
if(childNode.Name == name)
{
firstPath.Add(childNode.Name);
run = false;
}
else if(childNode.ChildNodes == null) //last descendant
{
firstPath.RemoveAt(firstPath.Count - 1); //remove the most recent
}
else
{
if (run)
{
firstPath.Add(childNode.Name);
path(name, childNode);
}
}
}
}
private static void printPath(List<string> list)
{
foreach(string str in list)
{
System.Diagnostics.Debug.WriteLine(str);
}
}
示例 XML 文档:
<XML_Tree_Name>
<Root Node>
<Node 1>
<Node 2/>
<Node 3/>
</Node 1>
<Node 4>
<Node 5/>
<Node 6>
<Node 7/>
</Node 6>
</Node 4>
</Root Node>
假设我想获取从根到节点 7 的路径。这条路将是Root, 4, 6, 7
.但是,它不会删除未通向 7 的节点,因此记录的路径是 Root, 1, 2, 3, 4, 5, 6, 7
.
如何从列表中正确删除不指向所需节点的节点?
您的代码不起作用,因为所有路径都将节点添加到列表中。 (== null 永远不会为真,它将是一个空列表。
为了大大简化您的代码,请从 END 开始并向后工作。
var list = new List<XElement>();
var s = @"<RootNode><Node1><Node2/><Node3/></Node1><Node4><Node5/><Node6><Node7/></Node6></Node4></RootNode>";
var doc = XDocument.Parse(s);
var finalNode = doc.XPathSelectElement("//Node7");
for(var currentNode = finalNode; currentNode != null; currentNode = currentNode.Parent)
{
list.Add(currentNode);
}
foreach(var node in list)
{
Console.WriteLine(node.Name);
}
此外,如果不需要全局范围的变量,则应避免使用它们。 从函数返回列表:
private static List<XElement> GetPath(...) {...}
static void Main()
{
var pathList = GetPath(...);
PrintPath(pathList);
}