TL; DR版本:如何读取XML文件中属于子元素的子元素的属性?
我有一个XML文件,其中包含各种项目的数据。
XML文件如下所示:
<items>
<item name="Item 1" value="10" weight="3.0">
<mods healthMod="0" staminaMod="0" manaMod="0"></mods>
</item>
<item name="Item 2" value="20" weight="5.0">
<mods healthMod="10" staminaMod="0" manaMod="0"></mods>
</item>
</items>
因此,正如您所看到的,“基本节点”项具有值和权重等属性。还有一个子元素,包含healthMod,staminaMod和manaMod等属性。
我创建了一个包含反序列化数据的类:
[System.Serializable]
[XmlRoot("items")]
public class ItemDirectory {
[XmlElement("item")]
public Item[] items;
}
我可以使用以下代码从项目基本节点成功读取所有元素和属性:
Dictionary<string,Item> itemDictionary;
public static void FillItemDictionary() {
itemDictionary = new Dictionary<string,Item>();
item = new Item();
string path = "C:/items.xml";
var xmlSerializer = new XmlSerializer(typeof(ItemDirectory));
var stream = File.Open(path, FileMode.Open);
var deserializedItems = xmlSerializer.Deserialize(stream) as ItemDirectory;
stream.Close();
for(int i = 0; i < deserializedItems.items.Length; i++) {
Item itemCur = deserializedItems.items[i];
itemDictionary.Add (itemCur.name, itemCur);
//Debug.Log("Item " + i + " name: " + itemCur.name + " Value: " + itemCur.value);
//Debug.Log(itemDictionary["Item 1"].value);
}
}
因此,它读取XML文件中的项目并使用Item类将它们分配给项目字典:
[System.Serializable]
public class Item {
[XmlAttribute("name")]
public string name = "";
[XmlAttribute("type")]
public string type;
[XmlAttribute("value")]
public int value = 0;
[XmlAttribute("weight")]
public float weight = 0.0f;
//mods
[XmlAttribute("healthMod")]
public int healthMod = 0;
[XmlAttribute("staminaMod")]
public int staminaMod = 0;
[XmlAttribute("manaMod")]
public int manaMod = 0;
}
但是,这似乎不会读取和/或分配“mods”元素中的嵌套属性:healthMod,staminaMod,manaMod。我该怎么做?
我找到的关于PHP或使用过的XMLElement.Load的线程,我甚至没有经验(根本没有),但此时我对所有建议持开放态度,因为我花了一整天时间寻找答案! :)
答案 0 :(得分:0)
我相信以下内容应该有效
[System.Serializable]
public class Item {
[XmlAttribute("name")]
public string name = "";
[XmlAttribute("type")]
public string type;
[XmlAttribute("value")]
public int value = 0;
[XmlAttribute("weight")]
public float weight = 0.0f;
[XmlElement("mods")]
public Mods mods = new Mods();
}
[System.Serializable]
public class Mods
{
[XmlAttribute("healthMod")]
public int healthMod = 0;
[XmlAttribute("staminaMod")]
public int staminaMod = 0;
[XmlAttribute("manaMod")]
public int manaMod = 0;}
}
有一点需要注意的是,您确实应该使用公共属性而不是公共字段来遵循正确的C#编码标准。