Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Запрос к XML


Автор: Miller_time 17.5.2011, 10:13
Есть XML файл с такой структурой

Код

<row>
<field name="FIO" value="Иванов Иван Иванович"/>
<field name="DELO" value="109"/>
<field name="FACULT" value="ФСПОиДП"/>
</row>
<row>
<field name="FIO" value="Сергей Сергеевич "/>
<field name="DELO" value="110"/>
<field name="FACULT" value="ФСПОиДП"/>
</row>
...
...
...



надо выбрать все записи у которых поле field имеет атрибут name="FACULT" и значение к примеру ФСПОиДП


Пишу так 

Код

            var Groups = from gr in doc.Descendants("row")
                         where gr.Element("field").Attribute("name").Value == "FACULT"
                         select gr;


Но уже на этой стадии мне возращаются пустрые значения.

Автор: WarHog 17.5.2011, 12:48
Код

var Groups = xmlDoc.Descendants("row")
                .SelectMany(r => r.Elements("field"))
                .Where(f => f.Attribute("name").Value == "FACULT" && f.Attribute("value").Value == "ФСПОиДП");

Автор: -Mikle- 17.5.2011, 13:35
или так:
Код

            var groups =
                doc.Descendants("row")
                    .Where(row => row.Descendants("field")
                        .Any(f => f.Attribute("name").Value == "FACULT" && f.Attribute("value").Value == "ФСПОиДП"));

Автор: Miller_time 17.5.2011, 13:53
О_о

Код

            XDocument doc = XDocument.Load(fileName);

            var Groups = doc.Descendants("row")
                .SelectMany(r => r.Elements("field"))
                .Where(f => f.Attribute("name").Value == "FACULT" && f.Attribute("value").Value == DropDownList1.Text);

             var Groups1 = doc.Descendants("row")
                .SelectMany(r => r.Elements("field"))
                .Where(z => z.Attribute("name").Value == "SPECNAME" && z.Attribute("value").Value == DropDownList2.Text);


            int i = 0;
            foreach (var item in Groups1)
            {
                if (i < 10)
                {
                    Label1.Text += item.ToString() + "<br>";
                }
                i++;

            }


Получилось вот так, все заработало хорошо только, объясните пожалуйста 


Код

            var Groups = doc.Descendants("row")
                .SelectMany(r => r.Elements("field"))
                .Where(f => f.Attribute("name").Value == "FACULT" && f.Attribute("value").Value == DropDownList1.Text)
                .Where(z => z.Attribute("name").Value == "SPECNAME" && z.Attribute("value").Value == DropDownList2.Text);


При попытке указать еще одно условие значения уже не возращаются :(

Добавлено через 4 минуты и 28 секунд
А еще если можно подскажите как можно сделать сортировку например по атрибуту <field name="DELO" value="110"/>?

Автор: -Mikle- 17.5.2011, 13:59
Потому что второй Where накладывается на результат первого Where и получается что ты соединяшь их через -И-. Как понял, тебе нужен -ИЛИ-:
Код

var Groups = doc.Descendants("row")
                .SelectMany(r => r.Elements("field"))
                .Where((f => f.Attribute("name").Value == "FACULT" && f.Attribute("value").Value == DropDownList1.Text) || (f => f.Attribute("name").Value == "SPECNAME" && f.Attribute("value").Value == DropDownList2.Text));


Добавлено через 5 минут и 56 секунд
Кстати, чтоб ты не запутался между вариантом WarHog и моим, поясню разницу. В моем случае возвращается коллекция элементов row в которых филды соответствуют критериям. В варианте WarHog возвращается коллекция элементов field, которые соответствует критериям. Это так, чтоб понимал разницу и мог выбрать, что тебе нужно для твоей задачи.

Автор: Miller_time 17.5.2011, 14:07
именно И, но ничего не возращает..:(

Автор: -Mikle- 17.5.2011, 14:12
Ну значит нет подходящих записей. Проверь все данные и помни, что у тебя регистрозависимый поиск.

Добавлено через 4 минуты и 33 секунды
Для сортировки используй OrderBy

Автор: Miller_time 17.5.2011, 15:28
Извините что то не совсем понимаю с сортировкой

Код

var rows0 = from a in doc.Descendants("row")
                       from b in a.Elements("field")
                       from c in b.Attributes("value")
                       where c.Value == DropDownList1.Text
                       select a;

            var rows1 = from a in rows0
                        from b in a.Elements("field")
                        from c in b.Attributes("value")
                        where c.Value == DropDownList2.Text
                        select a;



            
            Label1.Text = "";
            int i = 0;
            foreach (var item in rows1)
            {
                RateUser ru = new RateUser();
                foreach (var fields in item.Elements("field"))
                {
                    if (fields.Attribute("name").Value == "FIO")
                    {
                        Label1.Text += fields.Attribute("value").Value.ToString()+"   ";
                        ru.FIO = fields.Attribute("value").Value.ToString();
                    }
                    if (fields.Attribute("name").Value == "DELO")
                    {
                        Label1.Text += fields.Attribute("value").Value.ToString() + "<br />";
                        ru.rateing = int.Parse(fields.Attribute("value").Value.ToString());
                    }
                }
                i++;
                list_users.Add(ru);
            }


Как вот в этом запросе можно подлючить сортировку по определенному атрибуту записи 
Код

            var rows1 = from a in rows0
                        from b in a.Elements("field")
                        from c in b.Attributes("value")
                        where c.Value == DropDownList2.Text
                        select a;


Пробовал сделать вот так но судя по запиясям сортирует по первому атрибуту записи.

Код

            var rows1 = from a in rows0
                        from b in a.Elements("field").OrderBy(t=> t.Attribute("name").Value)
                        from c in b.Attributes("value")
                        where c.Value == DropDownList2.Text
                        select a;

Автор: WarHog 17.5.2011, 17:48
если я правильно понял вопрос о сортировке, то д.б. что-то вроде этого
Код

foo = xmlDoc.Descendants("row")
                .OrderBy(r => r.Descendants("field").First(f => f.Attribute("name").Value == "DELO").Attribute("value").Value)
                .SelectMany(r => r.Elements("field"))
                 .Where(f => f.Attribute("name").Value == "FACULT");

Автор: -Mikle- 17.5.2011, 22:18
Вообще я так и не понял, тебе после запроса нужно получить список строк у которых поля соответствуют критериям, или получить сплошной список полей без какого-либо отношения к строкам?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)