0

我正在尝试基于 xml 内容构建数据结构。

结构如下所示:

Dictionary<string, List<Dictionary<string, string>>>

XML 看起来像这样:

<Table name="testTable">
<Row>
  <Column name="test01" value="2029" />
  <Column name="test02" value="2029" />
</Row>
<Row>
  <Column name="test01" value="2029" />
  <Column name="test02" value="2029" />
</Row>
</Table>
<Table name="testTable01">
<Row>
  <Column name="test01" value="2029" />
  <Column name="test02" value="2029" />
</Row>
<Row>
  <Column name="test01" value="2029" />
  <Column name="test02" value="2029" />
</Row>
</Table>

它应该导致类似的结果:

Dictionary<tableName, List<Dictionary<columnName, columnValue>>>

使用一些嵌套的 foreach 循环来做到这一点是没有问题的,但我正在寻找一种方法来使用 LINQ 扩展方法“在一行中”做到这一点。我怎么能那样做?

4

2 回答 2

4

听起来你想要这样的东西:

var tables = doc.Descendants("Table")
                .ToDictionary(t => (string) t.Attribute("name"),
                              t => ExtractRowsFromTable(t));

...

private static List<Dictionary<string, string>> ExtractRowsFromTable(XElement table)
{
    return table.Elements("Row")
                .Select(row => row.Elements("Column")
                                  .ToDictionary(c => (string) c.Attribute("name"),
                                                c => (string) c.Attribute("value"))
                .ToList();
}

可以在一行中完成所有这些,基本上是内联ExtractRowsFromTable——但我真的不会。

于 2012-09-13T19:22:32.790 回答
1
string xml = 
        @"<Root>
            <Table name=""testTable"">
                <Row>
                    <Column name=""test01"" value=""2029"" />
                    <Column name=""test02"" value=""2029"" />
                </Row>
                <Row>
                    <Column name=""test01"" value=""2029"" />
                    <Column name=""test02"" value=""2029"" />
                </Row>
            </Table>
            <Table name=""testTable2"">
                <Row>
                    <Column name=""test01"" value=""2029"" />
                    <Column name=""test02"" value=""2029"" />
                </Row>
                <Row>
                    <Column name=""test01"" value=""2029"" />
                    <Column name=""test02"" value=""2029"" />
                </Row>
            </Table>
        </Root>";
XDocument xDoc = XDocument.Parse(xml);
var table = xDoc
        .Descendants("Table")
        .Select(t => new
        {
            Name = t.Attribute("name").Value,
            Rows = t.Descendants("Row")
                    .Select(r=> r.Descendants("Column")
                                 .ToDictionary(c=>c.Attribute("name").Value,
                                               c=>c.Attribute("value").Value))
                    .ToList()
        })
        .ToList();
于 2012-09-13T19:29:04.890 回答