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();
    }
}

谁能告诉我"怎么了"?

c#中XML文件的反序列化

这里有一个提示;将示例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没有严重耦合的模型。