2016-08-21 63 views
1

我在將XML反序列化到位置對象列表時遇到問題。
考慮下面的XML:將Xml反序列化到列表<T> - 不期望xmlns ='

<?xml version="1.0" encoding="utf-8"?> 
    <locations> 
     <location id="1"> 
      <level name="3" complete="True" stars="1" firstMisson="True" secondMission="False" thridMission="False" /> 
     </location> 
     <location id="2"> 
      <level name="4" complete="True" stars="3" firstMisson="True" secondMission="True" thridMission="True" /> 
     </location> 
    </locations> 

及以下等級:

[System.Serializable] 
    [XmlRoot(ElementName = "level")] 
    public class Level 
    { 
     [XmlAttribute(AttributeName = "name")] 
     public string Name { get; set; } 
     [XmlAttribute(AttributeName = "complete")] 
     public string Complete { get; set; } 
     [XmlAttribute(AttributeName = "stars")] 
     public string Stars { get; set; } 
     [XmlAttribute(AttributeName = "firstMisson")] 
     public string FirstMisson { get; set; } 
     [XmlAttribute(AttributeName = "secondMission")] 
     public string SecondMission { get; set; } 
     [XmlAttribute(AttributeName = "thridMission")] 
     public string ThridMission { get; set; } 
    } 
    [System.Serializable] 
    [XmlRoot(ElementName = "location")] 
    public class Location 
    { 
     [XmlElement(ElementName = "level")] 
     public Level Level { get; set; } 
     [XmlAttribute(AttributeName = "id")] 
     public string Id { get; set; } 
    } 
    [System.Serializable] 
    [XmlRoot(ElementName = "locations")] 
    public class Locations 
    { 
     [XmlElement(ElementName = "location")] 
     public Location Location { get; set; } 

     public List<Locations> LocDb = new List<Locations>(); 
    } 
    [System.Serializable] 
    [XmlRoot(ElementName = "xml")] 
    public class Xml 
    { 
     [XmlElement(ElementName = "locations")] 
     public Locations Locations { get; set; } 
    } 

反序列化方法

 public List<Locations> locDB = new List<Locations>(); 

    public static void LoadData() 
     { 
      string filepath = Application.dataPath + @"/XML/GameXMLdata.xml"; 

      var xmlSerializer = new XmlSerializer(locDB.GetType()); 
      var stream = File.Open(filepath, FileMode.Open); 


      locDB = (List<Locations>)xmlSerializer.Deserialize(stream);//locations xmlns=''> was not expected 

      stream.Close(); 

      Debug.Log(locDB[1].Location.Id); 

     } 

那麼,如何反序列化XML來定位對象的列表?

非常感謝您的幫助。

回答

0

你只需要兩個類:

[XmlType("level")] 
public class Level 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("complete")] 
    public string Complete { get; set; } 
    [XmlAttribute("stars")] 
    public string Stars { get; set; } 
    [XmlAttribute("firstMisson")] 
    public string FirstMisson { get; set; } 
    [XmlAttribute("secondMission")] 
    public string SecondMission { get; set; } 
    [XmlAttribute("thridMission")] 
    public string ThridMission { get; set; } 
} 

[XmlType("location")] 
public class Location 
{ 
    [XmlElement("level")] 
    public Level Level { get; set; } 
    [XmlAttribute("id")] 
    public string Id { get; set; } 
} 

重要的是應用XmlType屬性類Location而非XmlRoot。現在

你可以反序列化的XML,以便List<Location>這樣的:

var xmlSerializer = new XmlSerializer(typeof(List<Location>), 
    new XmlRootAttribute("locations")); 
List<Location> locations; 
using (var stream = File.OpenRead(filepath)) 
    locations = (List<Location>)xmlSerializer.Deserialize(stream); 

關鍵是要指定根元素名稱使用XmlSerializer(Type, XmlRootAttribute)構造函數重載(在你的情況下,「位置」)。

+0

非常感謝 – Slimper