Необходимо десериализовать данные из текущего xml документа. Я взял готовый xml файл:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<address>24</address>
<city>New-York</city>
<state>Alabama</state>
<firstPerson>
<age>19</age>
<name>Jey</name>
<department>none</department>
</firstPerson>
<secondPerson>
<age>22</age>
<name>Abraham</name>
<department>none</department>
</secondPerson>
</root>
и по нему сгенерировал по нему модель
[XmlRoot(ElementName="firstPerson")]
public class FirstPerson {
[XmlElement(ElementName="age")]
public string Age { get; set; }
[XmlElement(ElementName="name")]
public string Name { get; set; }
[XmlElement(ElementName="department")]
public string Department { get; set; }
}
[XmlRoot(ElementName="secondPerson")]
public class SecondPerson {
[XmlElement(ElementName="age")]
public string Age { get; set; }
[XmlElement(ElementName="name")]
public string Name { get; set; }
[XmlElement(ElementName="department")]
public string Department { get; set; }
}
[XmlRoot(ElementName="root")]
public class Root {
[XmlElement(ElementName="address")]
public string Address { get; set; }
[XmlElement(ElementName="city")]
public string City { get; set; }
[XmlElement(ElementName="state")]
public string State { get; set; }
[XmlElement(ElementName="firstPerson")]
public FirstPerson FirstPerson { get; set; }
[XmlElement(ElementName="secondPerson")]
public SecondPerson SecondPerson { get; set; }
}
Так как параметры (возраст и тд) одинаковые, я переделал модель данных
[Serializable]
[XmlRoot(ElementName="root")]
public class People
{
public byte Address { get; set; }
public string City { get; set; }
public string State { get; set; }
[XmlElement(ElementName = "firstPerson")]
public Person FirstPerson { get; set; }
[XmlElement(ElementName = "secondPerson")]
public Person SecondPerson { get; set; }
}
[Serializable]
[XmlRoot(ElementName = "root")]
public class Person
{
public byte Age { get; set; }
public string Name { get; set; }
public string Department { get; set; }
}
После чего читаю xml:
internal class Program
{
private const string xmlPath = "test.xml";
private static void Main(string[] args)
{
var value = DeserializeSettings();
Console.WriteLine(value.Address);
Console.WriteLine(value.City);
Console.WriteLine(value.State);
Console.WriteLine(value.FirstPerson.Age);
Console.WriteLine(value.FirstPerson.Name);
Console.WriteLine(value.FirstPerson.Department);
Console.ReadKey();
}
private static People DeserializeSettings()
{
try
{
var serializer = new XmlSerializer(typeof(People));
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlPath);
var reader = new StreamReader(path);
var people = (People) serializer.Deserialize(reader);
reader.Close();
return people;
}
catch (Exception e)
{
Console.WriteLine(e);
return new People();
}
}
}
В итоге получаю 0 или пустоту (в зависимости от типа данных), где я ошибся?
Верните всем свойствам атрибут [XmlElement(ElementName="age")]
и т. п.
Дело в том, что XML является регистро-зависимым (case-sensitive). То есть Age
и age
- разные узлы.
Поэтому либо обязательно нужно указывать атрибуты XmlElement
, либо изменить имена свойств в C# (но по гайдлайнам они должны начинаться с большой буквы, поэтому так не следует делать), либо изменить сам xml.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Получаю json по api преобразовываю в структуру, но там получается вложенные массивы и нужно это переконвертить в нужный мне классНо данные приходят...
Только пытаюсь разобраться с Wpf MVMMЕсть такая разметка