Sag*_*gar 3 .net c# xml xml-serialization
我想将xml字符串反序列化为定义如下的类型类的对象
[Serializable]
[XmlRoot("rt")]
public class XMLSessionParameters
{
[XmlArrayItem("el")]
public List<Elements> Elements { get; set; }
}
public class Elements
{
[XmlAttribute("nm")]
public string Name { get; set; }
[XmlAttribute("vl")]
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是我想要反序列化的 XML
<rt>
<el nm="Name" vl="ABCD_test"/>
<el nm="Dual" vl="AA"/>
<el nm="Quad" vl="ABCD"/>
<el nm="YYMMDD" vl="120614"/>
</rt>
Run Code Online (Sandbox Code Playgroud)
以下是我用于反序列化 XML 字符串的方法
public static XMLSessionParameters DeserializeSessionParameters(string xmlString)
{
XMLSessionParameters parameters = (XMLSessionParameters)Deserialize(typeof(XMLSessionParameters), xmlString);
XElement root = XElement.Parse(xmlString);
List<XElement> fileElements = root.Elements().ToList();
foreach (XElement fileEle in fileElements)
{
string xml = fileEle.ToString();
Elements ele = (Elements)Deserialize(typeof(Elements), xml);
parameters.Elements.Add(ele);
}
return parameters;
}
private static object Deserialize(Type type, string XmlString)
{
XmlSerializer serializer = new XmlSerializer(type);
StringReader stringReader = new StringReader(XmlString);
XmlReader xmlReader = new XmlTextReader(stringReader);
object serializedObj = serializer.Deserialize(xmlReader);
return serializedObj;
}
Run Code Online (Sandbox Code Playgroud)
当我将上述 XML 作为字符串传递并调用 Deserialize 函数时,XMLReader 对象将该值设为 None 并且我的程序突然结束,没有给出任何异常。这种行为的原因是什么?
xml 与类不匹配;你需要:
[XmlElement("el")]
public List<Elements> Elements { get; set; }
Run Code Online (Sandbox Code Playgroud)
您对[XmlArrayItem](带有隐式[XmlArray])的使用适用于 xml:
<rt>
<Elements>
<el nm="Name" vl="ABCD_test"/>
<el nm="Dual" vl="AA"/>
<el nm="Quad" vl="ABCD"/>
<el nm="YYMMDD" vl="120614"/>
</Elements>
</rt>
Run Code Online (Sandbox Code Playgroud)
(注意额外的Elements包装元素)。如果您[XmlElement]改为使用,则将其删除。另外:删除[Serializable]:XmlSerializer 不需要那个。
检查您的属性是否正确的简单方法:设置一些典型对象并将它们序列化- 将您获得的内容与您需要的 xml 进行比较。
完整示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
static class Program
{
static void Main()
{
string xmlString = @"<rt>
<el nm=""Name"" vl=""ABCD_test""/>
<el nm=""Dual"" vl=""AA""/>
<el nm=""Quad"" vl=""ABCD""/>
<el nm=""YYMMDD"" vl=""120614""/>
</rt>";
XMLSessionParameters parameters = (XMLSessionParameters)Deserialize(typeof(XMLSessionParameters), xmlString);
// parameters now has 4 elements, all correctly configured
}
private static object Deserialize(Type type, string XmlString)
{
XmlSerializer serializer = new XmlSerializer(type);
StringReader stringReader = new StringReader(XmlString);
XmlReader xmlReader = new XmlTextReader(stringReader);
object serializedObj = serializer.Deserialize(xmlReader);
return serializedObj;
}
}
[XmlRoot("rt")]
public class XMLSessionParameters
{
[XmlElement("el")]
public List<Elements> Elements { get; set; }
}
public class Elements
{
[XmlAttribute("nm")]
public string Name { get; set; }
[XmlAttribute("vl")]
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)