使用LINQ将列表值转换为XML
本文关键字:转换 XML 列表 LINQ 使用 | 更新日期: 2023-09-27 18:12:28
我在列表中有这种格式的数据
<>之前30 .配置项ItemA LoaderA ConfigB默认=18020 .配置项ItemB LoaderA ConfigAItemB LoaderA ConfigB默认=120ItemB LoaderA ConfigCItemC LoaderB ConfigDItemC LoaderB ConfigE默认=120ItemC LoaderB ConfigF 10项目名称:LoaderB ConfigDItemA LoaderB ConfigE默认=3010 .条目加载配置之前我试图使用LINQ通过ApplicationName (loaderA和B在这种情况下)分组数据然后需要根据ProductName (ItemA、ItemB和ItemC)进行分组,使用获得的数据生成XML文档在下面的格式
<Application Name=LoaderA>
<Product Name=ItemA>
<Config Name=ConfigA>30</Config>
<Config Name=ConfigB>Default=180</Config>
<Config Name=ConfigC>20</Config>
</Product>
<Product Name=ItemB>
<Config Name=ConfigA>30</Config>
<Config Name=ConfigB>Default=120</Config>
<Config Name=ConfigC>30</Config>
</Product>
</Application>
<Application Name=LoaderB>
<Product Name=ItemC>
<Config Name=ConfigD>30</Config>
<Config Name=ConfigE>Default=120</Config>
<Config Name=ConfigF>20</Config>
</Product>
<Product Name=ItemA>
<Config Name=ConfigD>30</Config>
<Config Name=ConfigE>Default=120</Config>
<Config Name=ConfigF>30</Config>
</Product>
</Application>
谁能分享一下我应该如何按项目分组,以便我利用XElement类创建上述格式的XML
你说你正在学习LINQ,所以我比平时更多地使用LINQ。这将生成与您的xml完全相同的xml,除了属性被引号包围之外。
class ListFileToXmlConverter
{
private class Entry
{
public string Application { get; set; }
public string Product { get; set; }
public string Config { get; set; }
public string Value { get; set; }
}
private IEnumerable<Entry> LoadEntries(string filename)
{
return File.ReadAllLines(filename)
.Where(line => !String.IsNullOrWhiteSpace(line))
.Select(line => line.Split(new[] {''t'}))
.Select(split => new Entry
{
Product = split[0],
Application = split[1],
Config = split[2],
Value = split[3]
});
}
public XElement ConvertToXml(string filename)
{
return new XElement("root",
LoadEntries(filename)
.GroupBy(entry => entry.Application)
.Select(grouping =>
new XElement(
"Application",
new XAttribute("Name", grouping.Key),
grouping
.GroupBy(entry => entry.Product)
.Select(grouping2 =>
new XElement(
"Product",
new XAttribute("Name", grouping2.Key),
grouping2.Select(entry =>
new XElement("Config",
new XAttribute("Name", entry.Config),
entry.Value)
)
)
)
)
)
);
}
}