LINQ and XDocument: How to create XML file? LINQ and XDocument: How to create XML file? xml xml

LINQ and XDocument: How to create XML file?


It's not clear exactly why the "Level" attributes are as specified, but this would create the relevant XML for you:

// 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)))));

It would probably be neater if you could extract the projections from a list item to its element, but the "Data_" + count bit makes that tricky. It's not clear why you need such a thing to be honest... if you could get away without that, the code could be cleaner.

I suppose one alternative would be to create the document without the Name attributes, and then populate them afterwards. For example:

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)));}

then:

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++);}


What about:

XDocument doc = new XDocument();var total = (from a in list1 select new { Name = a, Level = 2 }).Concat(             from b in list2 select new { Name = b, Level = 1 }).Concat(             from c in list3 select new { Name = c, Level = 0 });XElement root = new XElement("FileDetails", from i in Enumerable.Range(0, total.Count())                                            let element = total.ElementAt(i)                                            let name = new XAttribute("Name", String.Format("Data_{0}", i + 1))                                            let level = new XAttribute("Level", element.Level)                                            let datalist = new XAttribute("DataList", element.Name)                                            select new XElement("Data", name, datalist, level),                                            new XElement("Date", new XAttribute("FileModified", DateTime.Now)));