public class Root
{
// Mandatory elements
public string Element1 { get; set; }
public string Element2 { get; set; }
public string Element3 { get; set; }
// Dynamic elements
public List<string> Elements { get; set; }
}
We can use linq2xml to parse xml and populate the class with data.
var xml = XElement.Load("test.xml");
Root root = new Root();
root.Element1 = xml.Element("Element1").Value;
root.Element2 = xml.Element("Element2").Value;
root.Element3 = xml.Element("Element3").Value;
xml.Element("Element1").Remove();
xml.Element("Element2").Remove();
xml.Element("Element3").Remove();
root.Elements = xml.Elements()
.Where(elem => elem.Name.LocalName.Contains("Element"))
.Select(elem => elem.Value)
.ToList();
Console.WriteLine(root.Element1);
Console.WriteLine(root.Element2);
Console.WriteLine(root.Element3);
foreach (var text in root.Elements)
{
Console.WriteLine(text);
}
The best solution is to change the code that creates such xml. For example, xml might look like this
<root>
<!-- Mandatory elements -->
<Element1>text1</Element1>
<Element2>text2</Element2>
<Element3>text3</Element3>
<!-- Dynamic elements -->
<Elements>
<Element>textA</Element>
<Element>textB</Element>
<Element>textC</Element>
</Elements>
</root>
It's much easier to work with. And you can easily use deserialization.