当前位置: 首页 > 编程语言 > C#

Xml反序列化——将两个元素合并成一个List对象分享

时间:2023-04-10 22:41:35 C#

Xml反序列化——将两个元素合并成一个List对象我有一个XML文档,使用反序列化,有什么方法可以将两个元素合并成一个对象?XML示例:34我想创建一个包含项目3和4的列表(参数类型)。我尝试使用XmlArrayItem,例如:[XmlArrayItem("Parameter1")][XmlArrayItem("Parameter2")][XmlArray]公共参数[]参数;//也尝试过publicListParameters=newList();我尝试使用XmlElements(但我不知道如何组合它们):[XmlElement("Parameter1")]publicListParameters=newList();有没有一种方法可以做到这一点,而无需创建两个单独的列表,然后再将它们组合起来?请注意,更改XML格式不是一个选项。如果你这样做会怎样://getthexmldocconststringstr=@"34";varxml=newXmlDocument();//加载它xml.LoadXml(str);//获取名称中包含字符串参数的节点varxnList=xml.SelectNodes("//*[contains(name(),'Parameter')]");//创建一个参数列表varlist=newList();//用节点的内部文本中的值填充列表foreach(XmlNodexninxnList){list.Add(newParameter{Value=int.Parse(xn.InnerText)});}foreach(varparaminlist)Console.WriteLine(param.Value);//应该打印3和4我以这个类为例:classParameter{publicintValue{get;放;}}您的XML有一个包含choice元素的模式。choice元素代表一组固定的元素-在您的例子中是总和-将出现在XML中。XmlSerializer支持选择元素,如选择元素绑定支持中所述:如果单个选项元素的类型及其名称不同,则Xsd.exe仅将XmlElementAttribute属性应用于公共成员。如果它们仅在名称上不同,Xsd.exe还会应用XmlChoiceIdentifierAttribute并添加额外的逻辑来做出选择。因此,您可以使用以下选项反序列化XML:使用[XmlElementAttribute(String,Type)]将您的Parameter类子类化,并为每个元素名称指定不同的类型。因此,实例化的特定参数子类将捕获XML元素名称。即你可以这样做:publicabstractclassParameter{[XmlText]publicstringValue{get;放;}//如果你愿意,可以是int。}公共类参数1:参数{}公共类参数2:参数{}[XmlType(“根”)]公共类RootObject{[XmlElement(“参数1”,typeof(参数1))][XmlElement(“参数2”,typeof(参数2))]publicParameter[]Parameters{get;放;如果要使用同一个Parameter类型反序列化and元素,必须引入一个辅助的XmlChoiceIdentifierAttribute数组来捕获XML元素名称:publicclassParameter{[XmlText]publicstringValue{get;放;}}[XmlType("Root")]publicclassRootObject{[XmlElement("Parameter1",typeof(Parameter))][XmlElement("Parameter2",typeof(Parameter))][XmlChoiceIdentifier("ParametersElementName")]publicParameter[]参数{得到;放;}[XmlIgnore]publicParametersChoiceType[]ParametersElementName{get;放;}}[XmlType(IncludeInSchema=false)]publicenumParametersChoiceType{Parameter1,Parameter2,}反序列化后,ParametersElelementName数组将具有与ParametersElementName数组相同数量的条目,其中枚举值将指示实际遇到的每个参数的XML元素名称作为选项2的变体,如果您不需要捕获XML元素名称和只想反序列化值,您可以创建一个“假的”选择数组属性,如下所示:,typeof(Parameter))][XmlChoiceIdentifier("ParametersElementName")]publicParameter[]Parameters{get;放;}[XmlIgnore]publicParametersChoiceType[]ParametersElementName{get{if(Parameters==null)returnnull;returnParameters.Select(p=>ParametersChoiceType.Parameter1).ToArray();//任意returnItemsChoiceType.Parameter1}set{//什么都不做-不关心。XmlSerializer要求您使用这两个选项之一。如果它无法通过类型或项目选项标识符确定正确的元素名称,它会抛出一个InvalidOperationException并显示以下消息:您需要将XmlChoiceIdentifierAttribute添加到“Parameters”成员。显示每个选项的原型小提琴。以上就是C#学习教程:Xml反序列化——将两个元素组合成一个List对象,共享所有内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: