C# 序列化 XML 到对象

3
我将尝试将XML序列化为一个对象。然而,我遇到了一些麻烦。我已经查看了许多在线帖子以获取答案,但是我还没有找到解决方法。请允许我解释一下:
我有以下想要序列化的XML:
<Import_RootObject>
 <Organizations>
  <Import_Organization OrgNr="xxxx">
   <Events>
    <Import_Event StartTime="2012-01-01 09:00:00" EndTime="2012-01-02 12:00:00">
    <Players>
     <Import_Player PersonNummer="1111" />
     <Import_Player PersonNummer="2222" />
     <Import_Player PersonNummer="3333" />
     <Import_Player PersonNummer="4444" />
    </Players>
   </Import_Event>
  </Events>
 </Import_Organization>
</Organizations>

我使用了四个类来捕获这个XML:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

[XmlRoot("Import_RootObject")]
public class Import_RootObject
{
    [XmlArray("organizations")]
    [XmlArrayItem("organizations")]
    public List<Import_Organization> Organizations { get; set; }
}



using System;
using System.Collections.Generic;
using System.Xml.Serialization;

public class Import_Organization
{
    [XmlAttribute("orgnr")]
    public string OrgNr { get; set; }

    [XmlArray("events")]
    [XmlArrayItem("events")]
    public List<Import_Event> Events { get; set; }

}



using System;
using System.Collections.Generic;
using System.Xml.Serialization;

public class Import_Event
{
    [XmlAttribute("starttime")]
    public DateTime StartTime { get; set; }
    [XmlAttribute("endtime")]
    public DateTime EndTime { get; set; }

    [XmlArray("players")]
    [XmlArrayItem("players")]
    public List<Import_Player> Players { get; set; }

}



using System;
using System.Collections.Generic;
using System.Xml.Serialization;

public class Import_Player
{
    [XmlAttribute]
    public string PersonNummer { get; set; }

}

我使用的反序列化代码是:

XmlSerializer serializer = new XmlSerializer(typeof(Import_Organization));
Import_RootObject ei = (Import_RootObject)serializer.Deserialize(new StringReader(sb.ToString()));

我收到的错误信息是:
There is an error in XML document (1, 2).
<Import_RootObject xmlns=''> was not expected.

有人知道我在这里缺少什么吗?希望有人能帮忙!

敬礼,

鲍勃


使用关键词“XML文档中有错误(1,2)”进行谷歌搜索,你会得到大量相关的帖子。 - David
1
@David 大部分都与此示例完全无关... - Marc Gravell
1个回答

9
第一个显而易见的错误是:
XmlSerializer serializer = new XmlSerializer(typeof(Import_Organization));

当然应该是这样的:
XmlSerializer serializer = new XmlSerializer(typeof(Import_RootObject));

然而,您也应该注意XML是区分大小写的:
[XmlArray("organizations")]
[XmlArrayItem("organizations")]

should be:

[XmlArray("Organizations")]
[XmlArrayItem("Import_Organization")]

为了匹配XML格式,同样地。
[XmlArray("events")]
[XmlArrayItem("events")]

should be:

[XmlArray("Events")]
[XmlArrayItem("Import_Event")]

并且:

[XmlArray("players")]
[XmlArrayItem("players")]

should be:

[XmlArray("Players")]
[XmlArrayItem("Import_Player")]

此外,请注意<Players>不是Import_Event的后代,它属于Events。这使得情况有些复杂。
接下来我们需要注意的是你的日期不是"starttime" / "endtime",所以我们可以简化为:
[XmlAttribute]
public DateTime StartTime { get; set; }
[XmlAttribute]
public DateTime EndTime { get; set; }

除非那些日期/时间是有效的xml日期/时间,否则它们的格式不正确。因此,您现在可能必须将它们视为字符串数据。

最后,您的xml格式不正确 - 您没有关闭根元素。

坦白地说,我并不惊讶序列化程序不喜欢那个 :)。


嗨马克,出现“XML文件(1,2)中存在错误”错误可能有很多原因,你同意吗? - David
嗨Marc,你有我的永恒感激之情!我已经实现了你的更改,现在它像魔法一样工作!感谢你快速而准确的回复! - Robert Benedetto
1
@David 确定检查 InnerException 以查看实际问题是什么。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接