You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中自定义元素名带属性的XML序列化与反序列化问题

C# XML序列化/反序列化:自定义元素名与属性处理

刚好我之前处理过类似的场景,给你整理一套完整的实现方案,完美匹配你的需求:

1. 定义对应XML结构的实体类

核心是利用XmlSerializer的特性来精准映射XML元素和属性:

using System.Collections.Generic;
using System.Xml.Serialization;

// 对应根节点<library>
[XmlRoot("library")]
public class Library
{
    // 强制指定属性对应的XML元素名为"my.books",满足自定义元素名要求
    [XmlElement("my.books")]
    public BookCollection BookGroup { get; set; }
}

// 对应<my.books>节点,包含genre属性和子book列表
public class BookCollection
{
    // 映射genre属性
    [XmlAttribute("genre")]
    public string Genre { get; set; }

    // 让每个Book对象直接作为<my.books>的子节点,而非嵌套在额外容器中
    [XmlElement("book")]
    public List<Book> Books { get; set; } = new List<Book>();
}

// 对应<book>节点
public class Book
{
    [XmlAttribute("title")]
    public string Title { get; set; }

    [XmlAttribute("author")]
    public string Author { get; set; }
}

2. 序列化代码(对象转XML)

using System.IO;
using System.Xml;

public static string SerializeToXml(Library library)
{
    var serializer = new XmlSerializer(typeof(Library));
    var settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true };
    
    using var stringWriter = new StringWriter();
    using var xmlWriter = XmlWriter.Create(stringWriter, settings);
    
    serializer.Serialize(xmlWriter, library);
    return stringWriter.ToString();
}

// 使用示例
var myLibrary = new Library
{
    BookGroup = new BookCollection
    {
        Genre = "classic",
        Books = new List<Book>
        {
            new Book { Title = "1984", Author = "George Orwell" },
            new Book { Title = "Robinson Crusoe", Author = "Daniel Defoe" },
            new Book { Title = "Frankenstein", Author = "Mary Shelly" }
        }
    }
};

string xmlResult = SerializeToXml(myLibrary);
Console.WriteLine(xmlResult);

3. 反序列化代码(XML转对象)

using System.IO;

public static Library DeserializeFromXml(string xmlContent)
{
    var serializer = new XmlSerializer(typeof(Library));
    using var stringReader = new StringReader(xmlContent);
    return (Library)serializer.Deserialize(stringReader);
}

// 使用示例
string inputXml = @"<library> 
    <my.books genre=""classic""> 
        <book title=""1984"" author=""George Orwell"" /> 
        <book title=""Robinson Crusoe"" author=""Daniel Defoe"" /> 
        <book title=""Frankenstein"" author=""Mary Shelly"" /> 
    </my.books> 
</library>";

Library deserializedLib = DeserializeFromXml(inputXml);
// 验证结果
Console.WriteLine($"Genre: {deserializedLib.BookGroup.Genre}");
foreach (var book in deserializedLib.BookGroup.Books)
{
    Console.WriteLine($"《{book.Title}》 - {book.Author}");
}

关键特性说明

  • [XmlElement("my.books")]:直接指定属性对应的XML元素名称,哪怕名称包含点号也完全支持,完美解决你需要的自定义元素名需求
  • [XmlAttribute("genre")]:将类属性映射为XML元素的属性,精准匹配你的XML结构
  • [XmlElement("book")]:确保每个Book对象直接作为<my.books>的子节点,避免生成多余的容器节点

这样实现的代码完全适配你的XML结构,序列化和反序列化都能稳定工作。

内容的提问来源于stack exchange,提问作者Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:14:17