0

我在列表中有这种格式的数据

ItemA LoaderA ConfigA 30
ItemA LoaderA ConfigB 默认=180
ItemA LoaderA ConfigC 20

ItemB LoaderA ConfigA 30
ItemB LoaderA ConfigB 默认=120
ItemB LoaderA ConfigC 30

ItemC LoaderB ConfigD 30
ItemC LoaderB ConfigE 默认=120
ItemC LoaderB ConfigF 10

ItemA LoaderB ConfigD 30
ItemA LoaderB ConfigE 默认=30
ItemA LoaderB ConfigF 10

我正在尝试使用 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。

4

1 回答 1

1

正如您所说,您正在学习 LINQ,所以我使用 LINQ 的次数比平时多。这会产生与您的完全相同的 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)
                                        )
                                    )
                            )
                        )
                )
            );
    }
}
于 2013-05-08T09:10:16.710 回答