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

如何用单个C#类读取名称不同的XML元素?

用单个C#类兼容两种XML格式的解决方案

嘿,这个问题我之前碰到过,其实只需要给你的C#类做个小改动,就能用同一个类读取这两种XML格式了,具体做法如下:

核心思路

通过给y属性添加多个XmlElementAttribute,让.NET的XmlSerializer能够识别不同的元素名称(y和_y),从而实现单个类适配两种XML结构。

修改后的C#类

把原来的OrdinateZacrep类修改成这样,重点是给y属性加上两个XmlElement特性:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class OrdinateZacrep {
    private decimal xField;
    private decimal yField;

    /// <remarks/>
    public decimal x {
        get { return this.xField; }
        set { this.xField = value; }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("y")]
    [System.Xml.Serialization.XmlElementAttribute("_y")]
    public decimal y {
        get { return this.yField; }
        set { this.yField = value; }
    }
}

验证代码示例

你可以用下面的代码测试两种XML的反序列化,确保都能正常读取:

处理第一种XML(带<y>元素)

var xmlWithY = @"<ordinate>
    <x>587865.52</x>
    <y>1397457.84</y>
</ordinate>";

var serializer = new System.Xml.Serialization.XmlSerializer(
    typeof(OrdinateZacrep), 
    new System.Xml.Serialization.XmlRootAttribute("ordinate")
);

using var readerForY = new StringReader(xmlWithY);
var ordinateFromY = (OrdinateZacrep)serializer.Deserialize(readerForY);
// 这里ordinateFromY.y的值会是1397457.84,正确读取

处理第二种XML(带<_y>元素)

var xmlWithUnderscoreY = @"<ordinate>
    <x>587865.52</x>
    <_y>1397457.84</_y>
</ordinate>";

using var readerForUnderscoreY = new StringReader(xmlWithUnderscoreY);
var ordinateFromUnderscoreY = (OrdinateZacrep)serializer.Deserialize(readerForUnderscoreY);
// 这里ordinateFromUnderscoreY.y的值同样是1397457.84,完美适配

为什么这么做?

当你给属性添加多个XmlElementAttribute时,XmlSerializer在反序列化时会逐个检查XML中是否存在指定的元素名,只要匹配到其中一个,就会把对应的值赋给属性。这样就不用写两个类来适配不同的XML结构了,既简洁又好维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:14