c#中XML文件的反序列化
本文关键字:反序列化 文件 XML | 更新日期: 2023-09-27 17:50:44
我正在尝试反序列化一个XML文件,看起来像以下:
<xml>
<classes>
<class name="EventLog">
<attribute name="TYPE" type="int"></attribute>
<attribute name="DESCRIPTION" type="string"></attribute>
<attribute name="ISSUEDBY" type="string></attribute>
<attribute name="DATE" type="hr_clock"></attribute>
</class>
<class name="test">
<attribute name="ttt" type="int"></attribute>
<attribute name="ppp" type="string"></attribute>
<attribute name="xxx" type="string"></attribute>
<attribute name="aaa" type="hr_clock"></attribute>
</class>
</classes>
<filters>
<filter name="COILORDERFILTER">
<attribute name="COILID" type="string"></attribute>
<attribute name="RELIABID" type="string"></attribute>
</filter>
<filter name="DriveDataFilter">
<attribute name="DRIVEID" type="string"></attribute>
</filter>
</filters>
</xml>
我只需要节点classes
之间的类。我为反序列化创建了以下类:
[Serializable()]
[System.Xml.Serialization.XmlRoot("classes")]
public class ClassCollection
{
[XmlArray("class")]
[XmlArrayItem("attribute", typeof(SingleClass))]
public SingleClass[] singleClass { get; set; }
}
[Serializable()]
public class SingleClass
{
[System.Xml.Serialization.XmlAttribute("name")]
public string name { get; set; }
[System.Xml.Serialization.XmlAttribute("type")]
public string type { get; set; }
}
class Program
{
static void Main(string[] args)
{
ClassCollection classes = null;
string path = @"C:'Users'test'Desktop'Eventlog.xml";
XmlSerializer serializer = new XmlSerializer(typeof(ClassCollection));
StreamReader reader = new StreamReader(path);
try
{
classes = (ClassCollection)serializer.Deserialize(reader);
}
catch (InvalidOperationException excep)
{
Console.WriteLine(excep.ToString());
}
Console.Read();
}
}
谁能告诉我"怎么了"?
这里有一个提示;将示例xml放入一个文件- my.xml
,然后:
xsd my.xml
xsd my.xsd /classes
创建与xml匹配的my.cs
。
<xml/>
,因此需要[XmlRoot("xml")]
。你的意思肯定是:
[XmlArray("classes")]
[XmlArrayItem("class", typeof(SingleClass))]
public SingleClass[] singleClass { get; set; }
可以,例如:
[XmlRoot("xml")]
public class ClassCollection
{
[XmlArray("classes")]
[XmlArrayItem("class", typeof(SingleClass))]
public SingleClass[] singleClass { get; set; }
}
public class SingleClass
{
[XmlElement("attribute")]
public List<Attribute> Attributes { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
}
public class Attribute {
[XmlAttribute("name")]
public string name { get; set; }
[XmlAttribute("type")]
public string type { get; set; }
}
不确定您的问题,因为没有错误
但1:
[XmlRoot("classes")]
这意味着第一个XML节点应该是"classes",现在从您的示例中它是"XML"。因此创建一个新对象:
[XmlRoot("xml")]
class MyRoot {
//...
此外,通常你会想要这样的东西作为默认序列化器的第一行,我认为:
<?xml version="1.0" encoding="utf-8" ?>
另外,我认为您在数据类定义中有一些错误。你应该注释一些东西,用更少的数据做一些测试,以便正确地理解发生了什么。
如果你不能重新工作你的xml,你的问题是非常类似于这一个:使用XmlSerializer忽略外部元素
就我个人而言,我将使用XmlReader而不是XmlSerializer来反序列化示例XML,因为它允许构建一个与您正在读取的XML没有严重耦合的模型。