C# 如何将xml的节点值映射到类的不同属性名

使用[XmlElement]可将XML节点映射到不同名的类属性,如Name节点映射到FullName属性;2. 反序列化时XmlSerializer自动匹配特性指定的节点名;3. 支持嵌套类映射,通过[XmlElement]处理子节点结构;4. 其他特性如[XmlAttribute]、[XmlArray]等支持属性、集合等复杂场景。

在C#中,可以使用 XmlSerializer 将XML节点映射到类的属性。如果XML节点名称和类属性名不同,可以通过特性(Attribute)来指定映射关系。

1. 使用 [XmlElement] 特性进行字段映射

通过 [XmlElement] 特性,你可以将XML中的节点名绑定到类中任意名称的属性上。

例如,有如下XML:


  张三
  25

你想映射到类中名为 FullName 的属性而不是 Name,可以这样定义类:

using System.Xml.Serialization;

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

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

序列化或反序列化时,XmlSerializer 会自动将 XML 中的 节点值赋给 FullName 属性。

2. 反序列化示例代码

将XML字符串反序列化为对象:
using System;
using System.IO;
using System.Xml.Serialization;

string xml = @"
zuojiankuohaophpcnPersonyoujiankuohaophpcn
  zuojiankuohaophpcnNameyoujiankuohaophpcn张三zuojiankuohaophpcn/Nameyoujiankuohaophpcn
  zuojiankuohaophpcnAgeyoujiankuohaophpcn25zuojiankuohaophpcn/Ageyoujiankuohaophpcn
zuojiankuohaophpcn/Personyoujiankuohaophpcn";

XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StringReader reader = new StringReader(xml))
{
    Person person = (Person)serializer.Deserialize(reader);
    Console.WriteLine($"姓名: {person.FullName}, 年龄: {person.Age}");
}

3. 支持嵌套节点和复杂结构

对于嵌套的XML结构,也可以用同样的方式处理。

比如XML中有子节点:

```xml asicInfo> ```

可以定义嵌套类并映射:

[XmlRoot("Person")]
public class Person
{
    [XmlElement("BasicInfo")]
    public BasicInfo Info { get; set; }
}

public class BasicInfo
{
    [XmlElement("FirstName")]
    public string FirstName { get; set; }

    [XmlElement("LastName")]
    public string LastName { get; set; }
}

4. 其他常用特性

  • [XmlAttribute]:用于映射XML属性而非子节点。
  • [XmlArray][XmlArrayItem]:用于处理集合。
  • [DefaultValue]:设置默认值,避免生成冗余XML。

基本上就这些。只要在属性上加上合适的特性,就能灵活控制XML节点与C#类属性之间的映射关系,即使名字完全不同也没问题。