Непонятно точно почему атрибуты "Level" такие, как указано, но это создаст для вас соответствующий XML:
// Used for side-effects in the XElement constructor. This is a bit icky. It's
// not clear what the "Name" part is really for...
int count = 1;
var doc = new XDocument(
new XElement("FileDetails",
new XElement("Date", new XAttribute("FileModified", DateTime.UtcNow)),
l_lstData1.Select(x => new XElement("Data",
new XAttribute("Name", "Data_" + count++),
new XAttribute("DataList", x),
new XAttribute("Level", 2))),
l_lstData2.Select(x => new XElement("Data",
new XAttribute("Name", "Data_" + count++),
new XAttribute("DataList", x),
new XAttribute("Level", 1))),
l_lstData3.Select(x => new XElement("Data",
new XAttribute("Name", "Data_" + count++),
new XAttribute("DataList", x),
new XAttribute("Level", 0)))));
Возможно, было бы лучше, если бы вы могли извлекать проекции из элемента списка в его элемент, но бит "Data_" + count
усложняет задачу. Непонятно, зачем вам такая вещь, если честно ... если бы вы могли обойтись без этого, код мог бы быть чище.
Полагаю, одной альтернативой было бы создать документ без атрибутов Name
, а затем заполнить их. Например:
private static IEnumerable<XElement> ProjectList(IEnumerable<string> list,
int level)
{
return list.Select(x => new XElement("Data",
new XAttribute("DataList", x),
new XAttribute("Level", level)));
}
, то:
var doc = new XDocument(
new XElement("FileDetails",
new XElement("Date", new XAttribute("FileModified", DateTime.UtcNow)),
ProjectList(l_lstData1, 2),
ProjectList(l_lstData2, 1),
ProjectList(l_lstData3, 0)));
int count = 1;
foreach (var element in doc.Descendants("Data"))
{
element.SetAttributeValue("Name", "Data_" + count++);
}