2015-12-30 4 views
0

Я пытаюсь преобразовать свой XML-документ в C# 2D-список. Но когда я делаю это список пуст ...Deserialize XML to C# 2D List

Вот мой XML-файл:

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <levels> 
    <level ID="0"> 
     <theItem ID="0"> 
     <type>Corner</type> 
     <rotation>180</rotation> 
     <positionX>-5.5</positionX> 
     <positionY>-2.5</positionY> 
     </theItem> 
     <theItem ID="1"> 
     <type>TripleBar</type> 
     <rotation>270</rotation> 
     <positionX>-4.5</positionX> 
     <positionY>-2.5</positionY> 
     </theItem> 
     <theItem ID="2"> 
     <type>Corner</type> 
     <rotation>270</rotation> 
     <positionX>-3.5</positionX> 
     <positionY>-2.5</positionY> 
     </theItem> 
     <theItem ID="3"> 
     <type>Bar</type> 
     <rotation>0</rotation> 
     <positionX>-5.5</positionX> 
     <positionY>-1.5</positionY> 
     </theItem> 
    </level> 
    </levels> 
</data> 

И это мои классы:

[Serializable] 
public class theItem 
{ 
    [XmlAttribute("ID")] 
    public string ID { get; set; } 
    [XmlElement("type")] 
    public string type { get; set; } 
    [XmlElement("rotation")] 
    public int rotation { get; set; } 
    [XmlElement("positionX")] 
    public int positionX { get; set; } 
    [XmlElement("positionY")] 
    public int positionY { get; set; } 
} 

[Serializable] 
public class level 
{ 
    [XmlAttribute("ID")] 
    public string ID { get; set; } 
    [XmlArray("level")] 
    public List<theItem> theItems { get; set; } 
} 

[Serializable] 
[XmlRoot("data")] 
public class data 
{ 
    [XmlArray("levels")] 
    [XmlArrayItem("level")] 
    public List<level> levels { get; set; } 
} 

И это мой десериализатор код:

var serializer = new XmlSerializer(typeof(data)); 
     using (var reader = XmlReader.Create("LevelData.xml")) 
     { 
      data info = (data)serializer.Deserialize(reader); 
      List<level> levels = info.levels; 
     } 

Проблема в том, что когда я пытаюсь проверить длину каждого списка, мой первый список имеет длину 1, которая является нормой l, но second is = 0 ... Что я хочу сказать, так это то, что я хочу получить такой список: Список уровней < уровня и на каждом уровне, чтобы быть списком < theItem> theItems with theItem элементы и каждый элемент для его содержимого, как в файле XML ... Я пробовал несколько способов, но я не нашел решения для своей проблемы. Спасибо заранее и извините за мой плохой английский!

+0

КПП. «-5.5» не является int. –

+0

Обратите внимание, что атрибут [Serializable] ** не является ** каким-либо образом связанным с сериализацией XML. –

+0

Моя ошибка здесь, я изменил на float ... –

ответ

1

Я считаю, что это может сработать. Измените класс уровня, как это:

[Serializable] 
public class level 
{ 
    [XmlAttribute("ID")] 
    public string ID { get; set; } 
    [XmlArray("level")] 
    public List<theItem> items { get; set; } 
} 

А затем изменить XML, как это:

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <levels> 
    <level ID="0"> 
     <items> 
     <theItem ID="0"> 
     <type>Corner</type> 
     <rotation>180</rotation> 
     <positionX>-5.5</positionX> 
     <positionY>-2.5</positionY> 
     </theItem> 
     <theItem ID="1"> 
     <type>TripleBar</type> 
     <rotation>270</rotation> 
     <positionX>-4.5</positionX> 
     <positionY>-2.5</positionY> 
     </theItem> 
     <theItem ID="2"> 
     <type>Corner</type> 
     <rotation>270</rotation> 
     <positionX>-3.5</positionX> 
     <positionY>-2.5</positionY> 
     </theItem> 
     <theItem ID="3"> 
     <type>Bar</type> 
     <rotation>0</rotation> 
     <positionX>-5.5</positionX> 
     <positionY>-1.5</positionY> 
     </theItem> 
    </items> 
    </level> 
    </levels> 
</data> 

Edit:

Как Ондрей правильно указывает: Большинство ваших значений позиции не может быть сериализован как ints. Таким образом, изменяя их в поплавках будет работать лучше:

[XmlElement("positionX")] 
public float positionX { get; set; } 
[XmlElement("positionY")] 
public float positionY { get; set; } 

Edit 2: Simpler решение

В вашем исходном файле XML Вы используете <level> как список <theItem>, поэтому вам необходимо обновить объекты чтобы отразить это. Вы можете просто сделать это, сделав уровень, расширяющий список, похожим на этот, и используйте исходную XML-структуру:

[Serializable] 
public class level : List<theItem> 
{ 
    [XmlAttribute("ID")] 
    public string ID { get; set; } 
} 
+0

Нет, еще 0 для второго списка ... –

+0

При работе с десериализацией изменение формата данных - это * не * правильный путь, если только это невозможно обработать. –

+0

Теперь он работает, изменил переменные класса theItem от int до float и добавил к моему XML , а также изменил класс уровня [XmlArray («items»)] и имя списка для элементов, и все работает отлично! Благодаря! –