从文件中读取所有属性(也是嵌套的!)

时间:2014-11-14 21:37:35

标签: c# xml serialization

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的线程,我甚至没有经验(根本没有),但此时我对所有建议持开放态度,因为我花了一整天时间寻找答案! :)

1 个答案:

答案 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#编码标准。