Добавление значений во вложенный словарь в C # - PullRequest
1 голос
/ 30 августа 2010

У меня есть XML-файл следующей структуры

<Root>
    <Child Name="First">
        <Data Name="a" val="0"/>
         <Data Name="b" val="1"/>
        <Data Name="c" val="20"/>
        <Data Name="d" val="10"/>
         <Data Name="e" val="2"/>
         <Data Name="f" val="0"/>
         <Data Name="g" val="0"/>
         <Data Name="h" val="0"/>
    </Child>
    <Child Name="Second">
        <Data Name="a" val="0"/>
         <Data Name="b" val="0"/>
         <Data Name="c" val="0"/>
         <Data Name="d" val="0"/>
         <Data Name="e" val="0"/>
         <Data Name="f" val="0"/>
         <Data Name="g" val="50"/>
        <Data Name="h" val="30"/>
    </Child>
</Root>

и словарь типа

        Dictionary<String, Dictionary<String, String>> Dict = new Dictionary<string, Dictionary<string, string>>();

мне нужно добавить данные из файла xml в диктонар, например

        First    b  1
                c  20
                d  10
                e  2

        second   g  50
                h  30

мне нужно добавить только элемент данных, значение атрибута которого "val" не равно нулю

Теперь я использую для этого вложенные циклы for.

Есть ли способ сделать это, используя XML для LINQ

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

Это немного долго, но ... что ты можешь сделать?

XElement root = XElement.Parse(xml);

var dict = root.Elements("Child")
    .ToDictionary(
        child => child.Attribute("Name").Value,
        child => child.Elements("Data")
            .Where(data => data.Attribute("val").Value != "0")
            .ToDictionary(
                data => data.Attribute("Name").Value,
                data => data.Attribute("val").Value
            )
    );
1 голос
/ 30 августа 2010

Вот один из способов сделать это:

string path = @"E:\tmp\test.xml";
var doc = XDocument.Load(path);
var query =
    from child in doc.Root.Elements("Child")
    select new
    {
        Name = child.Attribute("Name").Value,
        Data = child.Elements("Data")
                    .Where(data => data.Attribute("val").Value != "0")
                    .ToDictionary(
                        data => data.Attribute("Name").Value,
                        data => data.Attribute("val").Value)
    };
var dict = query.ToDictionary(child => child.Name, child => child.Data);

А вот еще один:

string path = @"E:\tmp\test.xml";
var doc = XDocument.Load(path);
var query =
    from child in doc.Root.Elements("Child")
    from data in child.Elements("Data")
    where data.Attribute("val").Value != "0"
    group data by child.Attribute("Name").Value;

var dict = q2.ToDictionary(
            g => g.Key,
            g => g.ToDictionary(
                    data => data.Attribute("Name").Value,
                    data => data.Attribute("val").Value));

Выберите, что вам больше нравится;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...