在C#中加载XML文件并将数据反序列化为Dictionary

时间:2019-06-20 23:28:52

标签: c# xml deserialization

我正在为一个字符串进行个人本地化项目,其中数据包含在XML文件中并反序列化为Dictionary。

除了包含统计信息的主XML文件之外,我还将字符串数据保存在单独的文件中,并分别加载到指定的语言文件中。我通过ID提取匹配的字符串数据,该ID用作显示正确语言的字符串数据的键。

我是C#和序列化的初学者,并且已经在一个更简单的版本上工作,其中Dictionary只是属性和字符串值的int密钥。那行得通,我正在尝试以此为基础。

在此版本中,该值将是一个对象。我曾尝试将数据包装在其他元素中,但理想情况下,我希望避免使用较少的行,并且随着文件变大,使我更易于阅读和编辑。

XML文件:

<DataStrings>
    <ItemString id="1">
        <Name>Item 1</Name>
        <ID>1</ID>
        <Description>Item 1's description</Description>
    </ItemString>

    <ItemString id="2">
        <Name>Berry</Name>
        <ID>2</ID>
        <Description>Item 2's description</Description>
    </ItemString>

    <ItemString id="3">
        <Name>Shotgun</Name>
        <ID>3</ID>
        <Description>Item 3's description</Description>
    </ItemString>
</DataStrings>

适用的C#代码:

public IDictionary<int, Data> ItemStringData = new Dictionary<int, Data>();

public class ItemString {
    [XmlAttribute("id")]
    public int Key;

    // not sure what to put here
    public Data Value;
}


public class Data {
    [XmlElement("Name")]
    public string Name = null;

    [XmlElement("ID")]
    public int ID = 0;

    [XmlElement("Description")]
    public string Description;

}


public Dictionary<int, Data> LoadDictionary2(string path) {
    Dictionary<int, Data> dict = new Dictionary<int, Data> { };

    using (var reader = new StreamReader(path)) {
        XmlSerializer deserializer = new XmlSerializer(typeof(List<ItemString>), new XmlRootAttribute("DataStrings"));
        dict = ((List<ItemString>)deserializer.Deserialize(reader)).ToDictionary(x => x.Key, x => x.Value);
    }

    return dict;
}

反序列化后,代码成功获取每个项目的id密钥,但该值返回null。

在这篇文章中,我想请教几天尝试后的下一步建议。这甚至是正确/有效的XML吗?这是存储数据的有效方法吗?我对MySQL数据库之间的关联以及PHP查询更为熟悉。

我应该删除ID属性,是否可以构建一个字典,从ID元素中获取键,并将所有数据作为值包含在类中?

更重要的是,朝着正确的方向推动将是惊人的。

1 个答案:

答案 0 :(得分:2)

您的[XmlAttribute("id")]位于错误的类中-它是Data的属性:

public class DataStrings
{
    [XmlElement("ItemString")]
    public List<Data> Value;
}

public class Data
{
    [XmlAttribute("id")]
    public int id;

    [XmlElement("Name")]
    public string Name = null;

    [XmlElement("ID")]
    public int ID = 0;

    [XmlElement("Description")]
    public string Description;

}

public Dictionary<int, Data> Main(string path)
{
    var stringReader = new StringReader("<DataStrings><ItemString id=\"1\"><Name>Item 1</Name><ID>1</ID><Description>Item 1's description</Description></ItemString><ItemString id=\"2\"><Name>Berry</Name><ID>2</ID><Description>Item 2's description</Description></ItemString><ItemString id=\"3\"><Name>Shotgun</Name><ID>3</ID><Description>Item 3's description</Description></ItemString></DataStrings>");
    XmlSerializer deserializer = new XmlSerializer(typeof(DataStrings), new XmlRootAttribute("DataStrings"));
    var dict = ((DataStrings)deserializer.Deserialize(stringReader)).Value.ToDictionary(x => x.id, x => new Data() { ID = x.ID, Name = x.Name, Description = x.Description });
    return dict;
}