C# .NET XML反序列化

C# .NET XML反序列化,c#,.net,xml,xml-serialization,C#,.net,Xml,Xml Serialization,我有以下XML提要。我需要对对象的列表进行反序列化。如何在.NET4.0C中实现这一点 足球 1. 5-2 $10 2. 3-2 $5 看一看关于如何进行XML序列化的教程,这里的示例与您的非常接近 基本上,您需要创建一个类来表示XML中的每个实体(例如,Sports)和相应的属性,然后使用XmlSerializer对其进行反序列化 更复杂的方法,但您可以处理奇怪的标记的地方,是使用一个,自己读入元素,并将其分配给适当的类/对象。看,这是一个很好的解释 xsd.exe是.NET SDK(软件)

我有以下XML提要。我需要对对象的
列表进行反序列化。如何在.NET4.0C中实现这一点


足球
1.
5-2
$10
2.
3-2
$5
看一看关于如何进行XML序列化的教程,这里的示例与您的非常接近

基本上,您需要创建一个类来表示XML中的每个实体(例如,
Sports
)和相应的属性,然后使用XmlSerializer对其进行反序列化

更复杂的方法,但您可以处理奇怪的
标记的地方,是使用一个,自己读入元素,并将其分配给适当的类/对象。
看,这是一个很好的解释

xsd.exe是.NET SDK(软件)附带的一个方便的小工具 开发工具包),可以让生活变得轻松,当你想快速去 从XML输入到强类型.NET对象

如果从XML文件开始:

1) 在VisualStudio中打开XML文件

2) 从XML菜单中单击“创建模式”。这将生成一个XSD 文件


其余部分。

除非您想要生成一个包含N
division_x
元素的XSD,其中x=[1..N]您必须实现
IXmlSerializable
。以下代码确实很好地反序列化了示例xml:

public class Sports : IXmlSerializable
{
    public string LotName { get; set; }

    public List<dynamic> Prices { get; set; }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        Prices = new List<dynamic>();
        reader.Read();
        LotName = reader.ReadElementContentAsString("lot_name", "");
        reader.Read();
        while (reader.Name.StartsWith("divisions_"))
        {
            reader.Read();
            var i = reader.ReadElementContentAsString("divisions", "");
            var m = reader.ReadElementContentAsString("match", "");
            var p = reader.ReadElementContentAsString("pay", "");
            Prices.Add(new { ID = i, Match = m, Pay = p });
            reader.Read();
        }

    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        throw new NotImplementedException();
    }

    #endregion
}

public class Games  {
    [XmlElement("sports")]
    public Sports Sports { get; set; }
}


[XmlRoot("body")]
public class Body 
{
    [XmlElement("games")]
    public Games Games { get; set; }

}
公共类运动:IXmlSerializable
{
公共字符串LotName{get;set;}
公开标价{get;set;}
#区域IXmlSerializable成员
public System.Xml.Schema.XmlSchema GetSchema()
{
返回null;
}
public void ReadXml(System.Xml.XmlReader)
{
价格=新列表();
reader.Read();
LotName=reader.ReadElementContentAsString(“批次名称”);
reader.Read();
while(reader.Name.StartsWith(“divisions”))
{
reader.Read();
var i=reader.ReadElementContentAsString(“divisions”,”);
var m=reader.ReadElementContentAsString(“匹配”,“匹配”);
var p=reader.ReadElementContentAsString(“支付”、“支付”);
Add(new{ID=i,Match=m,Pay=p});
reader.Read();
}
}
public void WriteXml(System.Xml.XmlWriter)
{
抛出新的NotImplementedException();
}
#端区
}
公开课游戏{
[XmlElement(“运动”)]
公共体育运动{get;set;}
}
[XmlRoot(“正文”)]
公共阶级团体
{
[XmlElement(“游戏”)]
公共游戏{get;set;}
}
它使用
XmlSerialization
,因为我不太确定如何使用
数据契约序列化程序来实现它(尽管我知道这是可以实现的)。您可能需要向
ReadXml
方法添加一些错误处理


另外,您可以使用一个实现XmlSerializer并发出大量动态类的类来实现它:)

您将不会得到一个集合;您将得到一个由单个
游戏组成的单个
主体
对象
由单个
运动组成的单个
对象
由单个
奖品组成的
对象
分区1
对象和
分区2
对象组成的对象…是否有数量可变的
标记?如果是这样,您可以使用XSLT将它们改为每个be
?如果标记不一致,你将很难反序列化到类中。@Brian Driscoll-为什么它不会反序列化?@DavidBonnici在你原来的帖子中,你缺少了结束标记。我已经修改了我的评论。哦,很抱歉-谢谢:)除了都使用XML之外,我甚至没有关闭。问题在于变量
标记。提供给的链接不再有效。
public class Sports : IXmlSerializable
{
    public string LotName { get; set; }

    public List<dynamic> Prices { get; set; }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        Prices = new List<dynamic>();
        reader.Read();
        LotName = reader.ReadElementContentAsString("lot_name", "");
        reader.Read();
        while (reader.Name.StartsWith("divisions_"))
        {
            reader.Read();
            var i = reader.ReadElementContentAsString("divisions", "");
            var m = reader.ReadElementContentAsString("match", "");
            var p = reader.ReadElementContentAsString("pay", "");
            Prices.Add(new { ID = i, Match = m, Pay = p });
            reader.Read();
        }

    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        throw new NotImplementedException();
    }

    #endregion
}

public class Games  {
    [XmlElement("sports")]
    public Sports Sports { get; set; }
}


[XmlRoot("body")]
public class Body 
{
    [XmlElement("games")]
    public Games Games { get; set; }

}