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

如何构建类实现两种差异化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:00:27