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 拡張メソッドを使用して「1 行で」それを行う方法を探しています。どうすればそれができますか?

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();
}

基本的にインライン化して、これらすべてを 1 行で実行できます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 に答える