从XML中选择,构建数据结构

时间:2012-09-13 19:09:03

标签: c# xml linq

我正在尝试基于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扩展方法“在一行中”完成。我怎么能这样做?

2 个答案:

答案 0 :(得分: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 - 但我真的不会。

答案 1 :(得分: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();