使用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将列表值转换为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)
                                        )
                                    )
                            )
                        )
                )
            );
    }
}