【问题标题】:Maintaining Parent-Child Relationship During XML Serialization/Deserialization在 XML 序列化/反序列化期间维护父子关系
【发布时间】:2015-08-20 23:25:39
【问题描述】:

在反序列化 XML 文件时是否可以保持父子关系,其中每个父子文件都有一个唯一标识符。例如,如果“名称”标签始终包含唯一 ID,那么在以下 XML 中维护父子关系的最佳方法是:

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

在类中,有一个属性来容纳“名称”标签中的父节点的文本值,以及父名称的标签。例如,名称为“Room 1”的“Room”标签将具有父节点名称的属性,即“Bldg 1”和父节点标签的属性,即“Building”。我无法控制架构,但这是数据格式的简化版本。

【问题讨论】:

  • 是的,如何计划解析 XML。您打算使用反序列化还是打算使用其他方法?如果要为 tge XML 中的每个非叶标记(叶是字符串、int、DateTime 等对象)构建一个唯一类,则使用反序列化。如果您不需要类结构,您可以使用 XML Linq 等其他方法来反序列化 xml。
  • 我还没有对 XML 文件做太多的工作,我还没有决定如何解析它。我计划反序列化为类,并且可能正在考虑实现一个实现 IXMLSerializable 接口的基类来调整读取和写入方法。从本质上讲,我有按照上述 XML 结构的数据,我想将这些数据反序列化为类以进行进一步操作,同时保持原始父子关系。不过,我对方向持开放态度。

标签: c# xml serialization parent-child


【解决方案1】:

我不反对序列化。只是展示了使用 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();
        }
    }
}

【讨论】:

  • XML Linq 是我看过的东西,但我认为对于带有许多标签的大型 XML 文件来说它相当麻烦。我希望创建一个基类,它为其他类继承的读取和写入 XML 方法添加控制。我认为这将是一个简洁的选项,而且很容易更新,但如果它不比使用 XML Linq 更简单,那么您提出的解决方案也一样好。
  • 有人抱怨 XML 反序列化速度慢,也有人抱怨 Linq 速度慢、效率低。您使用的方法实际上取决于很多因素。 XML 中标签的大小和数量,以及您计划读取数据的次数。如果不了解完整的项目,很难给出建议。我最好的建议是使代码尽可能简单,并且在您采用不同的方法时易于修改。还可以使用少量 XML 样本进行一些基准测试,以比较不同的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2012-12-26
相关资源
最近更新 更多