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

C# 在C中加载XML文件并将数据反序列化为字典#,c#,xml,deserialization,C#,Xml,Deserialization,我正在做一个字符串的个人本地化项目,其中数据包含在XML文件中,并反序列化到字典中 除了保存统计信息的主XML文件外,我还将字符串数据保存在单独的文件中,分别加载到指定的语言文件中。我通过用作键的ID获取匹配的字符串数据,以正确的语言显示字符串数据 我是C#和序列化的初学者,并且已经开发了一个更简单的版本,其中字典只是属性和字符串值中的一个int键。这是可行的,我正试图以此为基础 使用此版本,值将是一个对象。我曾尝试将数据包装在一个附加元素中,但理想情况下,我希望避免使用较少的行,并在文件变大时

我正在做一个字符串的个人本地化项目,其中数据包含在XML文件中,并反序列化到字典中

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

我是C#和序列化的初学者,并且已经开发了一个更简单的版本,其中字典只是属性和字符串值中的一个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>

项目1
1.
项目1的说明
浆果
2.
项目2的说明
猎枪
3.
项目3的说明
适用的C#代码:

public IDictionary ItemStringData=new Dictionary();
公共类ItemString{
[XmlAttribute(“id”)]
公钥;
//不知道该在这里放什么
公共数据价值;
}
公共类数据{
[XmlElement(“名称”)]
公共字符串名称=null;
[XmlElement(“ID”)]
公共int ID=0;
[XmlElement(“描述”)]
公共字符串描述;
}
公共字典加载字典2(字符串路径){
Dictionary dict=新字典{};
使用(变量读取器=新的流读取器(路径)){
XmlSerializer反序列化器=新的XmlSerializer(typeof(List),新的XmlRootAttribute(“数据字符串”);
dict=((列表)反序列化器。反序列化(读取器)).ToDictionary(x=>x.Key,x=>x.Value);
}
返回命令;
}
反序列化后,代码成功地获取每个项的id键,但值返回null

在这篇文章中,我征求了几天的建议,看看下一步该怎么做。这是正确/高效的XML吗?这是存储数据的有效方法吗?我更熟悉MySQL数据库之间的关联,以及使用PHP进行查询

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

更重要的是,向正确的方向推进将是惊人的。

您的
[xmldattribute(“id”)]
属于错误的类别-它是数据的属性:

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;
}
公共类数据字符串
{
[XmlElement(“ItemString”)]
公共列表值;
}
公共类数据
{
[XmlAttribute(“id”)]
公共int id;
[XmlElement(“名称”)]
公共字符串名称=null;
[XmlElement(“ID”)]
公共int ID=0;
[XmlElement(“描述”)]
公共字符串描述;
}
公共字典主目录(字符串路径)
{
var stringReader=新的stringReader(“项目11项目1的说明berry2项目2的说明shotgun3项目3的说明”);
XmlSerializer反序列化器=新的XmlSerializer(typeof(DataStrings),新的XmlRootAttribute(“DataStrings”);
var dict=((DataStrings)反序列化器.反序列化(stringReader)).Value.ToDictionary(x=>x.id,x=>newdata(){id=x.id,Name=x.Name,Description=x.Description});
返回命令;
}
您的
[xmldattribute(“id”)]
属于错误的类-它是数据的一个属性:

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;
}
公共类数据字符串
{
[XmlElement(“ItemString”)]
公共列表值;
}
公共类数据
{
[XmlAttribute(“id”)]
公共int id;
[XmlElement(“名称”)]
公共字符串名称=null;
[XmlElement(“ID”)]
公共int ID=0;
[XmlElement(“描述”)]
公共字符串描述;
}
公共字典主目录(字符串路径)
{
var stringReader=新的stringReader(“项目11项目1的说明berry2项目2的说明shotgun3项目3的说明”);
XmlSerializer反序列化器=新的XmlSerializer(typeof(DataStrings),新的XmlRootAttribute(“DataStrings”);
var dict=((DataStrings)反序列化器.反序列化(stringReader)).Value.ToDictionary(x=>x.id,x=>newdata(){id=x.id,Name=x.Name,Description=x.Description});
返回命令;
}