如何构建类实现两种差异化XML结构的自动序列化?
解决XML序列化中MappedData多结构问题的类实现
针对你遇到的MappedData既可以是纯文本又可以是复杂节点的情况,需要手动调整类结构,结合XmlSerializer的特性来兼容两种格式,具体实现如下:
1. 定义完整的类结构
using System.Xml.Serialization; [XmlRoot("Source")] public class Source { [XmlAttribute("Alias")] public string Alias { get; set; } [XmlElement("Variable")] public Variable Variable { get; set; } } public class Variable { [XmlAttribute("HandleType")] public string HandleType { get; set; } [XmlElement("Id")] public string Id { get; set; } [XmlElement("Type")] public string Type { get; set; } [XmlElement("SamplingDimension")] public int? SamplingDimension { get; set; } [XmlElement("MappedData")] public MappedData MappedData { get; set; } } public class MappedData { [XmlAttribute("EfficientAccess")] public bool? EfficientAccess { get; set; } [XmlElement("RtdbItem")] public RtdbItem RtdbItem { get; set; } [XmlText] public string TextContent { get; set; } } public class RtdbItem { [XmlElement("TableName")] public string TableName { get; set; } [XmlElement("DataName")] public string DataName { get; set; } [XmlElement("Record")] public int Record { get; set; } }
2. 关键特性说明
[XmlText]:捕获MappedData节点的纯文本内容,对应第一种XML格式的字符串值。[XmlElement("RtdbItem")]:捕获MappedData节点下的子元素结构,对应第二种XML格式的复杂节点。- 可空类型(
bool?、int?):处理XML中可选的属性或元素(比如HandleType、SamplingDimension、EfficientAccess),不存在时自动赋值为null,避免序列化/反序列化报错。
3. 序列化与反序列化示例
// 反序列化示例 using (var reader = new StringReader(xmlContent)) { var serializer = new XmlSerializer(typeof(Source)); var source = (Source)serializer.Deserialize(reader); } // 序列化示例 var source = new Source { /* 赋值属性和子元素 */ }; using (var writer = new StringWriter()) { var serializer = new XmlSerializer(typeof(Source)); serializer.Serialize(writer, source); var xmlContent = writer.ToString(); }
为什么VS自动生成的类无法解决
Visual Studio的“Paste XML as Classes”功能只能基于单一XML结构生成类,无法识别同一节点的多格式情况,所以需要手动添加XmlText和对应子元素的特性来兼容两种结构。
内容的提问来源于stack exchange,提问作者vent1
相关产品推荐
相关产品推荐

