XML反序列化问题:如何匹配小写<product>元素与Product类
解决XmlSerializer大小写不匹配的反序列化问题
针对类名(Product)与XML元素名(<product>)大小写不匹配导致的反序列化失败问题,以下是无需修改类名或XML内容的解决方案,分场景说明:
场景1:<product>是XML根元素
如果你的XML结构以<product>为根,比如:
<product> <name>Wireless Headphones</name> <price>199.99</price> </product>
给Product类添加[XmlRoot("product")]特性即可,同时确保类为public(XmlSerializer仅处理public类型):
using System.Xml.Serialization; using System.IO; [XmlRoot("product")] public class Product { // 若XML子元素也是小写,需给属性加[XmlElement],比如<name>对应Name属性 [XmlElement("name")] public string Name { get; set; } [XmlElement("price")] public decimal Price { get; set; } } // 反序列化实现 public Product DeserializeProductXml(string xmlContent) { var serializer = new XmlSerializer(typeof(Product)); using var stringReader = new StringReader(xmlContent); return (Product)serializer.Deserialize(stringReader); }
如果之前加[XmlRoot]无效,检查是否误在反序列化时手动指定了错误的根元素名称,或者类的访问修饰符非public。
场景2:<product>是XML中的子元素
如果XML根元素是集合容器(比如<products>),内部包含多个<product>子元素,比如:
<products> <product> <name>Keyboard</name> <price>49.99</price> </product> <product> <name>Mouse</name> <price>29.99</price> </product> </products>
需要定义一个根类,在集合属性上标记[XmlElement("product")]来指定子元素名称:
[XmlRoot("products")] public class ProductCollection { [XmlElement("product")] public List<Product> Items { get; set; } = new List<Product>(); } public class Product { [XmlElement("name")] public string Name { get; set; } [XmlElement("price")] public decimal Price { get; set; } } // 反序列化实现 public ProductCollection DeserializeProductsXml(string xmlContent) { var serializer = new XmlSerializer(typeof(ProductCollection)); using var stringReader = new StringReader(xmlContent); return (ProductCollection)serializer.Deserialize(stringReader); }
以上两种方案都无需修改原有类名或XML元素,仅通过添加XML序列化特性即可解决大小写不匹配问题。
内容的提问来源于stack exchange,提问作者RandomUser
相关产品推荐
相关产品推荐

