如何用单个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
相关产品推荐
相关产品推荐

