- Home /
I'm trying to deserialize an XML file with no success
I have the following XML file:
  <world>
         <tile x="-2" y="0" z="4">
             <item id="3" />
         </tile>
         <tile x="-3" y="0" z="4">
             <item id="3" />
         </tile>
     </world>
world encompasses and array of tiles and each tile encompasses an array of items (not shown in this file).
I'm using the following function to deserialize the file:
 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 using System.Xml;
 using System.Xml.Serialization;
 using System.IO;
 using System.Text;
 
 [XmlRoot("world")]
 public class WorldContainer
 {
     [XmlArray("tile")]
     public Tile[] tiles;
     
     //load XML file
     public static WorldContainer Load(string path)
     {
         var serializer = new XmlSerializer(typeof(WorldContainer));
         using(var stream = new FileStream(path, FileMode.Open))
         {
             return serializer.Deserialize(stream) as WorldContainer;
         }
     }
     
Here are the classes involved: Tile class
 using UnityEngine;
 using System.Collections;
 using System.Linq;
 using System.Collections.Generic;
 using System.Xml;
 using System.Xml.Serialization;
 
 //Holds the stack and properties of each point in the game world
 public class Tile {
 
     [XmlArray("item")]
     public List<Item> stack;
 
     [XmlAttribute("x")]
     public int x;
     [XmlAttribute("y")]
     public int y;
     [XmlAttribute("z")]
     public int z;
 
     public Tile()
     {
         //stack = new List<Item> ();
     }
 
     public Tile(int X, int Y, int Z)
     {
         x = X;
         y = Y;
         z = Z;
         stack = new List<Item> ();
     }
 
     // Update is called once per frame
     void Update () {
     
     }
 }
Item class
 using UnityEngine;
 using System.Collections;
 using System.Xml;
 using System.Xml.Serialization;
 
 public class Item {
 
     [XmlAttribute("id")]
     public int id;
 
     [XmlIgnore]
     public GameObject item;
     [XmlIgnore]
     public int stackPos;
     [XmlIgnore]
     public int y;
 
     public Item()
     {
     }
 
     public Item(int Id, GameObject x, int stackpos, int yvalue)
     {
         id = Id;
         item = x;
         stackPos = stackpos;
         int y = yvalue;
         //typo?
     }
 
     public Item (Item copy)
     {
         id = copy.id;
         item = copy.item;
         stackPos = copy.stackPos;
         y = copy.y;
     }
 
     public Item(GameObject x)
     {
         item = x;
         worldObject properties = x.GetComponent<worldObject>();
         stackPos = properties.stackPosType;
         y = GUI.SelectedLevel;
     }
 }
Once I try to load and deserialize the file I do this:
 var grid = WorldContainer.Load (Path.Combine (Application.dataPath, "Resources/XMLFiles/" + fileName));
 
         
         //iterate through each tile and item read from the XML file
         int i = 0, j = 0;
         foreach(Tile tile in grid.tiles)
         {
             Debug.Log ("Tile "+i+": coordinates ("+tile.x+", "+tile.y+", "+tile.z+")");
             foreach(Item item in tile.stack)
             {
                 Debug.Log ("Item "+j+" id= "+item.id);
                 j++;
             }
             i++;
         }
         Debug.Log ("Finished reading...");
         
     }
It comes back with nothing, it only returns one tile and the coordinates are 0,0,0 which is not true if you look at the XML file.
I haven't had much luck dealing with XML, I've found articles and examples but they are confusing and I cannot figure out what is wrong.
Any input is appreciated, thanks in advance
Answer by dorpeleg · Mar 01, 2015 at 09:17 AM
Try using XmlElement instead of XmlArray. like so:
  [XmlElement("tile")]
  public Tile[] tiles;
and the Tile class:
 [XmlRoot("tile")]
 public class Tile
 {
     [XmlAttribute("x")]
     public int x;
 
     [XmlAttribute("y")]
     public int y;
 
     [XmlAttribute("z")]
     public int z;
 
     [XmlElement("item")]
     public Item[] items;
 }
Item class:
 [XmlRoot("item")]
 public class Item
 {
     [XmlAttribute("id")]
     public int id;
 }
I remember having issues with XmlArray myself.
@dorpeleg Thanks, it worked. Now the values I'm getting are what they're supposed to be
Your answer
 
 
             Follow this Question
Related Questions
Serialization and XML 1 Answer
System.Xml.Serialization in UWP with IL2CPP 4 Answers
3D Terrain or Mesh Grid 1 Answer
Unit Data in a Strategy Game 1 Answer
ArgumentException: Path is empty while saving data in an XML 0 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
               
 
			 
                