Raj*_*r G 15 c# xml linq linq-to-xml
我在c#中有一个三个List,变量名是l_lstData1, l_lstData2, l_lstData3.
文件结构是
<FileDetails>
<Date FileModified="29/04/2010 12:34:02" />
<Data Name="Data_1" DataList="India" Level="2" />
<Data Name="Data_2" DataList="chennai" Level="2" />
<Data Name="Data_3" DataList="hyderabad" Level="2" />
<Data Name="Data_4" DataList="calcutta" Level="2" />
<Data Name="Data_5" DataList="vijayawada" Level="1" />
<Data Name="Data_6" DataList="cochin" Level="1" />
<Data Name="Data_7" DataList="madurai" Level="0" />
<Data Name="Data_8" DataList="trichy" Level="0" />
</FileDetails>
Run Code Online (Sandbox Code Playgroud)
3个列表的值如下:
l_lstData1[0] = "India";
l_lstData1[1] = "chennai";
l_lstData1[2] = "hyderabad";
l_lstData1[3] = "calcutta";
Run Code Online (Sandbox Code Playgroud)
所以上面的XML(element:Data)的level属性值="2".
l_lstData2[0] = "vijayawada";
l_lstData2[1] = "cochin";
Run Code Online (Sandbox Code Playgroud)
所以上面的XML(element:Data)的level属性值="1".
l_lstData3[0] = "madurai";
l_lstData3[1] = "trichy";
Run Code Online (Sandbox Code Playgroud)
所以上面的XML(element:Data)的level属性值为"0".
Jon*_*eet 30
目前还不清楚为什么 "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)))));
Run Code Online (Sandbox Code Playgroud)
如果你可以将列表项中的投影提取到它的元素,那么它可能会更简洁,但是这"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)));
}
Run Code Online (Sandbox Code Playgroud)
然后:
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++);
}
Run Code Online (Sandbox Code Playgroud)