我正在为一个字符串进行个人本地化项目,其中数据包含在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元素中获取键,并将所有数据作为值包含在类中?
更重要的是,朝着正确的方向推动将是惊人的。
答案 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;
}