Десериализация элемента массива в элементе массива с помощью C#
Мой XML-файл выглядит примерно так:
<MyXml>
<Version> 9.3.2 </Version>
<Resources>
<Sets>
<ItemCollection>
<Item>
<Name> Name </Name>
<Age> 66 </Age>
</Item>
</ItemCollection>
</Sets>
</Resources>
Я пытаюсь добраться до предметов в ItemCollection, но пока не совсем удача; Вот как выглядит мой код:
Stream reader = new FileStream(fileLocation, FileMode.Open);
XmlSerializer s = new XmlSerializer(typeof(MyClass));
var items = s.Deserialize(reader) as MyClass;
И мои объекты выглядят так:
[Serializable]
[XmlRoot("MyXml")]
public class MyClass
{
[XmlElement("Version")]
public string Version { get; set; }
[XmlElement("Resources")]
public List<Resources> Resources{ get; set; }
}
[Serializable]
public class Resources
{
[XmlElement("Sets")]
public List<Sets> Sets { get; set; }
}
[Serializable]
public class Sets
{
[XmlArray(ElementName = "ItemCollection")]
[XmlArrayItem("Item")]
public List<Item> Items { get; set; }
}
[Serializable]
public class Item
{
[XmlElement("Name")]
public string Name{ get; set; }
[XmlElement("Age")]
public string Age { get; set; }
}
Я могу получить версию просто отлично, и иерархия выглядит хорошо, но Name и Age из объекта Item всегда равны нулю. Я пробовал XmlElement вместо XmlArray, но это тоже не работает.
Любая помощь о том, как этого добиться, будет высоко ценится!!!
РЕДАКТИРОВАТЬ: пример, который я привел, был упрощение XML, который я получаю: это на самом деле вызов REST-службы определения местоположения из BING API; XML, который я получаю, выглядит так, как в этом URL:
http://msdn.microsoft.com/en-us/library/ff701710.aspx
и что я пытаюсь вставить в свои структуры, так это информацию внутри элемента Location.
Мои настоящие объекты выглядят так:
[Serializable]
[XmlRoot("Response")]
public class LocationService
{
[XmlElement("StatusCode")]
public string Code{ get; set; }
[XmlElement("ResourceSets")]
public List<ResourceSets> ResourceSets{ get; set; }
}
[Serializable]
public class ResourceSets
{
[XmlElement("ResourceSet")]
public List<ResourceSet> ResourceSet { get; set; }
}
[Serializable]
public class ResourceSet
{
[XmlArray(ElementName = "Resources")]
[XmlArrayItem("Location")]
public List<Location> Locations { get; set; }
}
[Serializable]
public class Location
{
[XmlElement("Latitude")]
public string Latitude{ get; set; }
[XmlElement("Longitude")]
public string Longitude{ get; set; }
}
Надеюсь, это еще больше прояснит, чего я пытаюсь достичь здесь.
Спасибо!
1 ответ
Возможно, ваш входной файл неверен, потому что я считаю, что ваш код работает.
Вот быстрое консольное приложение, которое я написал для тестирования. Имя и Возраст десериализованы правильно.
Примечание: я предполагаю, что в вашем фактическом xml не отсутствует закрывающий тег, который отсутствует в вашем примере.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
[Serializable]
[XmlRoot("MyXml")]
public class MyClass
{
[XmlElement("Version")]
public string Version { get; set; }
[XmlElement("Resources")]
public List<Resources> Resources { get; set; }
}
[Serializable]
public class Resources
{
[XmlElement("Sets")]
public List<Sets> Sets { get; set; }
}
[Serializable]
public class Sets
{
[XmlArray(ElementName = "ItemCollection")]
[XmlArrayItem("Item")]
public List<Item> Items { get; set; }
}
[Serializable]
public class Item
{
[XmlElement("Name")]
public string Name { get; set; }
[XmlElement("Age")]
public string Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
string xml =
@"<MyXml>
<Version> 9.3.2 </Version>
<Resources>
<Sets>
<ItemCollection>
<Item>
<Name> Name </Name>
<Age> 66 </Age>
</Item>
</ItemCollection>
</Sets>
</Resources>
</MyXml>";
MemoryStream str = new MemoryStream( UTF8Encoding.UTF8.GetBytes( xml ) );
XmlSerializer s = new XmlSerializer(typeof(MyClass));
var items = s.Deserialize( str ) as MyClass;
Console.Write( "Done" );
}
}
}