LINQ和XDocument:如何创建XML文件?

我在c#中有一个三个List,变量名是l_lstData1, l_lstData2, l_lstData3

文件结构是

            

3个列表的值如下:

  l_lstData1[0] = "India"; l_lstData1[1] = "chennai"; l_lstData1[2] = "hyderabad"; l_lstData1[3] = "calcutta"; 

所以上面的XML(element:Data)的level属性值=“2”。

  l_lstData2[0] = "vijayawada"; l_lstData2[1] = "cochin"; 

所以上面XML(element:Data)的level属性值=“1”。

  l_lstData3[0] = "madurai"; l_lstData3[1] = "trichy"; 

所以上面的XML(element:Data)的level属性值=“0”。

目前尚不清楚为什么 “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 ProjectList(IEnumerable 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++); } 

关于什么:

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