admin管理员组

文章数量:1487745

c#复杂XML反序列化为实体对象两种方式

在C#开发中,我们经常需要处理XML数据,将其转换为实体对象。这个过程称为反序列化。反序列化XML可以采用多种方式,但主要有两种常见的方法:使用XmlSerializer和使用DataContractSerializer。本文将详细介绍这两种方法,并提供示例代码。

使用XmlSerializer进行反序列化

XmlSerializer是.NET Framework提供的一个类,用于将XML数据反序列化为对象。这种方法适用于静态类型的XML数据,即XML结构在编译时已经确定。

基本用法

首先,你需要定义一个与XML结构相匹配的C#类。然后,使用XmlSerializer来反序列化XML数据。

代码语言:javascript代码运行次数:0运行复制
using System;
using System.IO;
using System.Xml.Serialization;

[XmlRoot("Person")]
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string xmlData = @"<Person><Name>John Doe</Name><Age>30</Age></Person>";
        XmlSerializer serializer = new XmlSerializer(typeof(Person));
        using (StringReader reader = new StringReader(xmlData))
        {
            Person person = (Person)serializer.Deserialize(reader);
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
        }
    }
}

在这个示例中,我们定义了一个Person类,并使用XmlSerializer将XML字符串反序列化为Person对象。

处理复杂XML

对于复杂的XML数据,你可能需要定义多个类来表示不同的XML节点。

代码语言:javascript代码运行次数:0运行复制
using System;
using System.IO;
using System.Xml.Serialization;

[XmlRoot("Employees")]
public class Employees
{
    [XmlElement("Employee")]
    public Employee[] EmployeeList { get; set; }
}

public class Employee
{
    [XmlElement("Name")]
    public string Name { get; set; }

    [XmlElement("Age")]
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string xmlData = @"<Employees><Employee><Name>John Doe</Name><Age>30</Age></Employee></Employees>";
        XmlSerializer serializer = new XmlSerializer(typeof(Employees));
        using (StringReader reader = new StringReader(xmlData))
        {
            Employees employees = (Employees)serializer.Deserialize(reader);
            foreach (var employee in employees.EmployeeList)
            {
                Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
            }
        }
    }
}

在这个示例中,我们定义了一个Employees类来表示包含多个Employee的集合,并使用XmlSerializer反序列化XML数据。

使用DataContractSerializer进行反序列化

DataContractSerializer是另一种用于反序列化XML数据的.NET类。它适用于动态类型的XML数据,即XML结构在运行时可能发生变化。

基本用法

XmlSerializer类似,你需要定义一个与XML结构相匹配的C#类,并使用DataContractSerializer来反序列化XML数据。

代码语言:javascript代码运行次数:0运行复制
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string xmlData = @"<Person xmlns:i=''><Name>John Doe</Name><Age>30</Age></Person>";
        DataContractSerializer serializer = new DataContractSerializer(typeof(Person));
        using (StringReader reader = new StringReader(xmlData))
        using (XmlReader xmlReader = XmlReader.Create(reader))
        {
            Person person = (Person)serializer.ReadObject(xmlReader);
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
        }
    }
}

在这个示例中,我们定义了一个Person类,并使用DataContractSerializer将XML字符串反序列化为Person对象。

处理复杂XML

对于复杂的XML数据,DataContractSerializer同样可以处理。

代码语言:javascript代码运行次数:0运行复制
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;

[DataContract]
public class Employees
{
    [DataMember]
    public Employee[] EmployeeList { get; set; }
}

[DataContract]
public class Employee
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string xmlData = @"<Employees xmlns:i=''><Employee><Name>John Doe</Name><Age>30</Age></Employee></Employees>";
        DataContractSerializer serializer = new DataContractSerializer(typeof(Employees));
        using (StringReader reader = new StringReader(xmlData))
        using (XmlReader xmlReader = XmlReader.Create(reader))
        {
            Employees employees = (Employees)serializer.ReadObject(xmlReader);
            foreach (var employee in employees.EmployeeList)
            {
                Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
            }
        }
    }
}

在这个示例中,我们定义了一个Employees类来表示包含多个Employee的集合,并使用DataContractSerializer反序列化XML数据。

性能考量

在选择使用XmlSerializer还是DataContractSerializer时,性能是一个重要的考虑因素。DataContractSerializer通常比XmlSerializer更快,特别是在处理大型或复杂的XML文档时。然而,XmlSerializer在处理具有特定XML结构的数据时可能更灵活。

本文标签: c复杂XML反序列化为实体对象两种方式