根据子元素中定义的依赖关系反向遍历xml个节点到根节点
Reverse traverse xml node to root node based on dependencies defined in subelement
我有一个带有节点的 XML 结构。每个节点可能有也可能没有对另一个节点的一个或多个依赖关系。我想根据起始节点依赖项或依赖项从一个节点反向遍历到根节点。以下代码的结果,从节点 w/id=6 开始,将是:6, 2, 1, 5, 4
using System;
using System.Xml;
namespace ReverseTraverseXML
{
class Program
{
static void Main()
{
string xmlData = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<nodes>
<node>
<id>1</id>
</node>
<node>
<id>2</id>
<dependency>1</dependency>
</node>
<node>
<id>3</id>
<dependency>2</dependency>
</node>
<node>
<id>4</id>
</node>
<node>
<id>5</id>
<dependency>4</dependency>
</node>
<node>
<id>6</id>
<dependency>2</dependency>
<dependency>5</dependency>
</node>
</nodes>";
// Notice how node 4 does not have any dependencies. So it is an independent node.
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlData);
// Let's say we want to do a reverse traverse iteration of dependencies of node 6, so:
// 6 -> 2 -> 1 and 5 -> 4. Output should be: 6, 2, 1, 5, 4
Console.ReadKey();
}
}
}
谢谢!
您可以反序列化该结构,然后根据 Dependency Id 编号解析对象。例如,考虑以下
[XmlRoot(ElementName="node")]
public class Node
{
[XmlElement(ElementName="id")]
public int Id { get; set; }
[XmlElement(ElementName="dependency")]
public List<int> Dependency { get; set; }
}
[XmlRoot(ElementName="nodes")]
public class Nodes
{
[XmlElement(ElementName="node")]
public List<Node> Node { get; set; }
}
您现在可以将 xml 反序列化为
var serializer = new XmlSerializer(typeof(Nodes));
Nodes result;
using (TextReader reader = new StringReader(xmlData))
{
result = (Nodes)serializer.Deserialize(reader);
}
根据解析的结果,您可以创建一个递归方法来遍历节点的依赖项列表。
public IEnumerable<int> Parse(Nodes source,int Id)
{
var node = source.Node.First(x=>x.Id == Id);
yield return node.Id;
foreach(var d in node.Dependency)
{
foreach(var item in Parse(source,d))
yield return item;
}
}
您现在可以检索所需的结果
var parseOrder = Parse(result,6);
我有一个带有节点的 XML 结构。每个节点可能有也可能没有对另一个节点的一个或多个依赖关系。我想根据起始节点依赖项或依赖项从一个节点反向遍历到根节点。以下代码的结果,从节点 w/id=6 开始,将是:6, 2, 1, 5, 4
using System;
using System.Xml;
namespace ReverseTraverseXML
{
class Program
{
static void Main()
{
string xmlData = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<nodes>
<node>
<id>1</id>
</node>
<node>
<id>2</id>
<dependency>1</dependency>
</node>
<node>
<id>3</id>
<dependency>2</dependency>
</node>
<node>
<id>4</id>
</node>
<node>
<id>5</id>
<dependency>4</dependency>
</node>
<node>
<id>6</id>
<dependency>2</dependency>
<dependency>5</dependency>
</node>
</nodes>";
// Notice how node 4 does not have any dependencies. So it is an independent node.
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlData);
// Let's say we want to do a reverse traverse iteration of dependencies of node 6, so:
// 6 -> 2 -> 1 and 5 -> 4. Output should be: 6, 2, 1, 5, 4
Console.ReadKey();
}
}
}
谢谢!
您可以反序列化该结构,然后根据 Dependency Id 编号解析对象。例如,考虑以下
[XmlRoot(ElementName="node")]
public class Node
{
[XmlElement(ElementName="id")]
public int Id { get; set; }
[XmlElement(ElementName="dependency")]
public List<int> Dependency { get; set; }
}
[XmlRoot(ElementName="nodes")]
public class Nodes
{
[XmlElement(ElementName="node")]
public List<Node> Node { get; set; }
}
您现在可以将 xml 反序列化为
var serializer = new XmlSerializer(typeof(Nodes));
Nodes result;
using (TextReader reader = new StringReader(xmlData))
{
result = (Nodes)serializer.Deserialize(reader);
}
根据解析的结果,您可以创建一个递归方法来遍历节点的依赖项列表。
public IEnumerable<int> Parse(Nodes source,int Id)
{
var node = source.Node.First(x=>x.Id == Id);
yield return node.Id;
foreach(var d in node.Dependency)
{
foreach(var item in Parse(source,d))
yield return item;
}
}
您现在可以检索所需的结果
var parseOrder = Parse(result,6);