XML序列化/反序列化过程中父子关系的维护

本文关键字:父子关系 维护 过程中 反序列化 序列化 XML | 更新日期: 2023-09-27 18:08:56

在反序列化一个父级和子级都有唯一标识符的XML文件时,是否有可能维护父子关系?例如,如果"Name"标签总是包含一个唯一的ID,那么在以下XML中维护父子关系的最佳方法是什么?

<Building>
    <Name>Bldg 1</Name>
    <Room>
        <Name>Room 1</Name>
        <Table>
            <Name>Table 1</Name>
        </Table>
    </Room>
</Building>

在类中有一个属性,用于在"Name"标签中存放父节点的文本值,以及父节点的名称标签。例如,名称为"Room 1"的"Room"标签将具有父节点名称的属性,即"Bldg 1",以及父节点标记的属性,即"Building"。我无法控制模式,但这是数据格式的简化版本。

XML序列化/反序列化过程中父子关系的维护

我并不反对序列化。只是展示了使用XML Linq的不同方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
             "<Root>" +
               "<Building>" +
                  "<Name>Bldg 1</Name>" +
                  "<Room>" +
                    "<Name>Room 1</Name>" +
                    "<Table>" +
                        "<Name>Table 1</Name>" +
                    "</Table>" +
                  "</Room>" +
                  "<Room>" +
                    "<Name>Room 2</Name>" +
                    "<Table>" +
                        "<Name>Table 1</Name>" +
                    "</Table>" +
                  "</Room>" +
               "</Building>" +
               "<Building>" +
                  "<Name>Bldg 2</Name>" +
                  "<Room>" +
                    "<Name>Room 1</Name>" +
                    "<Table>" +
                        "<Name>Table 1</Name>" +
                    "</Table>" +
                  "</Room>" +
                  "<Room>" +
                    "<Name>Room 2</Name>" +
                    "<Table>" +
                        "<Name>Table 1</Name>" +
                    "</Table>" +
                  "</Room>" +
               "</Building>" +
            "</Root>";
            XElement root = XElement.Parse(input);
            var results = root.Descendants("Building").Select(x => new
            {
                name = x.Element("Name").Value,
                rooms = x.Elements("Room").Select(y => new
                {
                    name = y.Element("Name").Value,
                    Tables = y.Elements("Table").FirstOrDefault().Element("Name").Value
                }).ToList()
            }).ToList();
        }
    }
}