2014-11-14 64 views
0

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

没有创建一个名为'Mods'的类,并且它是Item的一个属性我不知道你是否可以用这种简单的搜索方式(使用属性)来做到这一点,如果你想这样做我认为你需要有'Items'实现['IXmlSerializable'](http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v = vs.110).aspx)。 – 2014-11-14 21:48:23

+0

我怀疑我将不得不创建一个子类“MODS”,这不是一个问题,但我不知道如何正确实现它; 我假设Item类将需要Mods类型的mods变量。好吧到目前为止。但是我怎样才能从XML文件的mods节点属性中填充这个mods变量的变量? – Cherno 2014-11-14 21:53:37

+0

与您在ItemDirectory中执行'Item'完全相同。 – 2014-11-14 21:55:19

回答

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

+0

感谢您的帮助和建议。我已经实现了它,事实上Unity Answers上的另一个用户也告诉我这些,它对我来说很有意义,但它仍然不会读取XML文件中的属性(或者说,从XML文件):( – Cherno 2014-11-14 23:08:48

+0

好吧,我在一个干净的环境中再次测试它,可以这么说,现在它可以工作。似乎我的项目数据库代码中存在某个错误,请再次感谢您的帮助,非常感谢。 – Cherno 2014-11-15 00:10:28

+0

Edit2 :我想我知道我做错了什么,在实施你的建议之前和实施期间,我将XML文件中的mod从属性改为了元素来测试,并忘记在所有混淆中改变它们。 – Cherno 2014-11-15 00:19:23