When trying a lot of examples of deserialize xml into a object in C#. I manage to get some values of some of the elements. But nested values from recuring nodes Like the ID of level 2 , or the values of level4) are giving me not the values I expected. Do I mis something??
The importing part is not a problem (I think)
The demo xml
<?xml version="1.0"?>
<root>
<b>value1</b>
<level1>
<level2>
<id>1</id>
<level3>
<level4>Value 1.1</level4>
<level4>Value 1.2</level4>
</level3>
</level2>
<level2>
<id>2</id>
<level3>
<level4>Value 2.1</level4>
<level4>Value 2.2</level4>
</level3>
</level2>
</level1>
</root>
the objects
[XmlRoot(ElementName = "root")]
public class root
{
[XmlElement("b")]
public string b { get; set; }
[XmlElement("level1")]
public level1 level1 { get; set; }
}
public class level1
{
[XmlElement("level2")]
public List<level2> level2 { get; set; }
}
public class level2
{
[XmlElement("id")]
public int id { get; set; }
[XmlElement("level3")]
public level3 level3 { get; set; }
}
public class level3
{
[XmlElement("level4")]
public List<string> level4 { get; set; }
//OR
//public string[] level4 { get; set; }
}
A parsehelper
static class ParseHelpers
{
public static Stream ToStream(this string @this)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(@this);
writer.Flush();
stream.Position = 0;
return stream;
}
public static T ParseXML<T>(this string @this) where T : class
{
var reader = XmlReader.Create(@this.Trim().ToStream()
, new XmlReaderSettings()
{
ConformanceLevel = ConformanceLevel.Document
});
return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
}
}
Deserialize
string filepath = @"C:\xml.xml";
string xml = File.ReadAllText(filepath);
var a = xml.ParseXML<root>();
Here some of the things I tried
Console.WriteLine(a.b);
// this is working :
// return
// value1
Console.WriteLine(a.level1.level2);
// expected error
// System.Collections.Generic.List`1[Project.level2]
Console.WriteLine(a.level1.level2[0].id.ToString());
// System.ArgumentOutOfRangeException: 'Index was out of range.
foreach(var item in (a.level1.level2))
{
Console.WriteLine(item.id.ToString());
}
// return
// 0
// 0
List<level2> l1 = a.level1.level2;
foreach (var item in (l1))
{
Console.WriteLine(item.id.ToString());
}
// return
// 0
// 0