将XML反序列化为对象(需要返回对象列表)

J-Y*_*J-Y 5 c# xml

开始练习XML和C#,我有一条错误消息"XML文档中存在错误(3,2)".看完文件后,我看不出有什么问题(请注意,我可能因为我是菜鸟而错过了一些东西).我正在使用C#的控制台应用程序.我正在尝试返回一个冒险家列表,只是一个旁注,GEAR元素是可选的.这是我到目前为止:

XML文件 - Test1

<?xml version="1.0" encoding="utf-8"?>
<Catalog>
    <Adventurer>
        <ID>001</ID>
        <Name>John Smith</Name>
        <Address>123 Fake Street</Address>
        <Phone>123-456-7890</Phone>
        <Gear>
            <Attack>
                <Item>
                    <IName>Sword</IName>
                    <IPrice>15.00</IPrice>
                </Item> 
                <Item>
                    <IName>Wand</IName>
                    <IPrice>20.00</IPrice>
                </Item>         
            </Attack>
            <Defense>
                <Item>
                    <IName>Shield</IName>
                    <IPrice>5.00</IPrice>
                </Item>
        </Defense>  
        </Gear>
    </Adventurer>
    <Adventurer>
        <ID>002</ID>
        <Name>Guy noone likes</Name>
        <Address>Some Big House</Address>
        <Phone>666-666-6666</Phone>
        <Gear></Gear>
    </Adventurer>
</Catalog>
Run Code Online (Sandbox Code Playgroud)

C#类

public class Catalog
{
    List<Adventurer> Adventurers { get; set; }
}

public class Adventurer
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
    public Gear Gear { get; set; }
}

public class Gear
{
    public List<Item> Attack { get; set; }
    public List<Item> Defense { get; set; }
}

public class Item
{
    public string IName { get; set; }
    public decimal IPrice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

序列化功能 - 第5行出现问题的位置

Catalog obj = null;
string path = @"C:\Users\Blah\Desktop\test1.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Catalog));
StreamReader reader = new StreamReader(path);
obj = (Catalog)serializer.Deserialize(reader);
reader.Close();

Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

Chr*_*air 3

问题是目录中的冒险家列表:

<?xml version="1.0" encoding="utf-8"?>
<Catalog>
    <Adventurers> <!-- you're missing this -->
        <Adventurer>
        </Adventurer>
        ...
        <Adventurer>
        </Adventurer>
    </Adventurers> <!-- and missing this -->
</Catalog>
Run Code Online (Sandbox Code Playgroud)

您没有集合的包装元素Adventurers

编辑:顺便说一句,我发现构建 XML 结构并确保其兼容的最简单方法是在 C# 中创建对象,然后运行内置对象XmlSerializer并使用其 XML 输出作为任何 XML 的基础我创造而不是手工形成它。