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

C#如何反序列化含动态元素的复杂XML文件?

XML反序列化问题的C#实现方案

核心实体类定义

根据XML结构层级,定义对应的数据类,使用XmlSerializer相关特性匹配XML元素:

Machine类(根节点)

[XmlRoot("Machine")]
public class Machine
{
    [XmlElement("Box")]
    public List<Box> Boxes { get; set; } = new List<Box>();

    [XmlElement("Component")]
    public List<Component> Components { get; set; } = new List<Component>();

    public GeoVar GeoVar { get; set; }
    public IfcProp IfcProp { get; set; }
}

Box类

public class Box
{
    [XmlElement("Component")]
    public List<Component> Components { get; set; } = new List<Component>();

    public GeoVar GeoVar { get; set; }
    public IfcProp IfcProp { get; set; }
}

Component类(含子组件)

public class Component
{
    [XmlElement("Subcomponent")]
    public List<Component> Subcomponents { get; set; } = new List<Component>();

    public GeoVar GeoVar { get; set; }
    public IfcProp IfcProp { get; set; }
}

GeoVar类(处理动态D开头元素)

针对不同对象的动态D元素,用XmlAnyElement捕获所有未知元素,再转换成字典方便访问:

public class GeoVar
{
    [XmlAnyElement]
    public List<XmlElement> DynamicElements { get; set; } = new List<XmlElement>();

    // 忽略序列化,仅用于快速访问动态元素的键值对
    [XmlIgnore]
    public Dictionary<string, string> DynamicValues => 
        DynamicElements.ToDictionary(e => e.Name, e => e.InnerText);
}

IfcProp类(描述性元素)

根据XML里IfcProp的内部结构定义属性,示例如下:

public class IfcProp
{
    [XmlElement("PropName")]
    public string PropertyName { get; set; }

    [XmlElement("PropValue")]
    public string PropertyValue { get; set; }

    [XmlElement("PropDesc")]
    public string PropertyDescription { get; set; }

    // 可根据实际XML结构添加更多对应属性
}

反序列化实现代码

using System.Xml.Serialization;
using System.IO;

public static Machine DeserializeMachine(string xmlPath)
{
    var serializer = new XmlSerializer(typeof(Machine));
    using (var stream = new FileStream(xmlPath, FileMode.Open))
    {
        return (Machine)serializer.Deserialize(stream);
    }
}

// 使用示例
// var targetMachine = DeserializeMachine(@"C:\your-file.xml");

关键注意事项

  • 若XML包含命名空间,需在XmlRoot和相关XmlElement特性中指定Namespace属性,比如[XmlRoot("Machine", Namespace = "http://your-namespace-uri")]
  • 确保类属性名称与XML元素名称大小写完全匹配,XmlSerializer对大小写敏感
  • 如果GeoVar中的D元素包含复杂子节点而非纯文本,直接操作DynamicElements里的XmlElement对象即可
  • 若Subcomponent的结构和Component完全一致,复用Component类无需额外定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:03:21