在反序列化一个父级和子级都有唯一标识符的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 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();
}
}
}