因此,我有一个XML文件,我试图将其供应到通用列表中,但是无论我做什么,列表都空无一人。我去了第一个〜10个堆栈溢出问题,但我还没有弄清楚。
当程序启动时,我致电FishContainer.load(),文件读取器读取文件恰到好处,但列表中没有任何内容。
XML文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FishContainer>
<Fishies>
<Fish Name = "test">
<WaterType>salt</WaterType>
<Price>1</Price>
<Size>1</Size>
<Aggression>1</Aggression>
</Fish>
<Fish Name = "test2">
<WaterType>fresh</WaterType>
<Price>12</Price>
<Size>12</Size>
<Aggression>12</Aggression>
</Fish>
</Fishies>
</FishContainer>
鱼容器
using UnityEngine;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
public static class FishContainer {
[XmlArray("Fishies"), XmlArrayItem("Fish")]
public static List<FishData> fishs = new List<FishData>();
public static void Load() {
TextAsset _xml = Resources.Load<TextAsset>("fishdata");
XmlSerializer serializer = new XmlSerializer(typeof(List<FishData>), new XmlRootAttribute("FishContainer"));
StringReader reader = new StringReader(_xml.text);
fishs = (List<FishData>)serializer.Deserialize(reader);
reader.Close();
Debug.Log(fishs.Count);
}
public static FishData GetFishAttributeByName(string name) {
foreach(FishData f in fishs) {
if(f.Name.Equals(name))
return f;
}
return null; //throw
}
}
鱼数据
using System.Xml;
using System.Xml.Serialization;
public class FishData {
[XmlAttribute("Name")] public string Name;
[XmlElement("WaterType")] public string WaterType;
[XmlElement("Price")] public int Price;
[XmlElement("Size")] public int Size;
[XmlElement("Aggression")] public int Aggression;
public override string ToString() {
return Name + " " + WaterType + " " + Price + " " + Size + " " + Aggression;
}
}
问题是您应该考虑使用List<FishData>
类型,但这不是您的XML文件在最高级别所包含的,而是FishContainer
,这又有其中的 List<FishData>
属性。
另外,您无法对静态属性或班级进行审理,因此至少需要删除FishContainer
中的静态修饰符和属性。这是我要纠正 FishContainer
的方式:
public class FishContainer
{
[XmlArray("Fishies"), XmlArrayItem("Fish")]
public List<FishData> Fishes { get; set; }
public static FishContainer Load(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(FishContainer), new XmlRootAttribute("FishContainer"));
using (StringReader reader = new StringReader(xml))
return (FishContainer)serializer.Deserialize(reader);
}
public FishData GetFishAttributeByName(string name)
{
return Fishes
.SingleOrDefault(fish => fish.Name.Equals(name));
}
}
通常,我个人只尝试使用static
方法或属性,如果它们不更改或保持某物的状态。您可以按以下方式称为;
var fishContainer = FishContainer.Load(_xml);
Console.WriteLine("I have {0} fishes", fishContainer.Fishes.Count);
编辑:但是,由于您希望它在FishContainer
的单个实例上可以静态可用,因此您可以做类似的事情:
public class FishContainer
{
private static FishContainer _instance;
[XmlArray("Fishies"), XmlArrayItem("Fish")]
public List<FishData> Fishes { get; set; }
public static void Load(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(FishContainer), new XmlRootAttribute("FishContainer"));
using (StringReader reader = new StringReader(xml))
_instance = (FishContainer)serializer.Deserialize(reader);
}
public static FishData GetFishAttributeByName(string name)
{
if (_instance == null)
throw new InvalidOperationException("FishContainer has not been loaded");
return
_instance
.Fishes
.SingleOrDefault(fish => fish.Name.Equals(name));
}
}
..并这样打电话:
FishContainer.Load(_xml);
var someFish = FishContainer.GetFishAttributeByName("test");