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
相关产品推荐
相关产品推荐

