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