首页 > 解决方案 > 根据子元素中定义的依赖关系反向遍历xml节点到根节点

问题描述

我有一个带有节点的 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();
        }
    }
}

谢谢!

标签: c#algorithmtraversal

解决方案


您可以反序列化结构,然后根据 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);

演示代码


推荐阅读