Форум программистов, компьютерный форум, киберфорум
Наши страницы
LINQ
Войти
Регистрация
Восстановить пароль
 
alkov03
1 / 1 / 2
Регистрация: 26.04.2015
Сообщений: 19
#1

LINQ to XML: работа с конкретным элементом - LINQ

06.11.2015, 19:45. Просмотров 354. Ответов 3

Всем доброго времени суток! Прошу помощи. Весь интернет перерыл, а ответа на интересующие вопросы так и не нашел. Есть некий XML документ, в который можно добавлять неограниченное число участников. У каждого участника уникальный код. Вот пример документа:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<Участники>
  <Участник Код_участника="0">
    <Имя>Иванов Иван Иванович</Имя>
    <Пол>Мужской</Пол>
    <Дата_рождения>1990-1-1</Дата_рождения>
    <Регион>Москва</Регион>
    <Звание_разряд>МС</Звание_разряд>
    <Тренер>Петров П. П.</Тренер>
  </Участник>
  <Участник Код_участника="1">
    <Имя>Сидоров Семен Семеныч</Имя>
    <Пол>Мужской</Пол>
    <Дата_рождения>2015-11-6</Дата_рождения>
    <Регион>Саратов</Регион>
    <Звание_разряд>КМС</Звание_разряд>
    <Тренер>Егоров Е. Е.</Тренер>
  </Участник>
</Участники>
Вот что меня интересует (LINQ to XML):
  • Как обратиться к конкретному участнику? Например к 8-му из 35-и.
  • Как удалить конкретного участника?
  • Как в цикле for перебирать весь список участников? Можно ли это сделать подобно классической работе с массивом?
    C#
    1
    
    for(i = 0; i < a.Length; i++)
  • Как изменить данные конкретной записи?

Все, что находил в интернете либо не то, либо запутанно, и новичку в этом деле не разобраться. Прошу прощения, если вопросы глупые, прежде не сталкивался с XML в C#, а штука, насколько я знаю, полезная.
http://www.cyberforum.ru/linq/thread959355.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2015, 19:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос LINQ to XML: работа с конкретным элементом (LINQ):

Парсинг XML-файла с помощью LINQ to XML
Здрасивуйте. Трабл никак не могу понять в чем дело не могу считать инфу с XML...

Xml linq добавить поле
Программно создаю следующий xml документ &lt;?xml version=&quot;1.0&quot;...

Не работает linq to xml запрос
Здравствуйте. У меня есть вот такой xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;...

Linq XML - повторяющийся атрибут
Здравствуйте! Помогите решить проблему. Есть код: XDocument doc = new...

LINQ to XML Null Reference
часть документа XML, таких несколько элементов &lt;weather&gt; ...

3
Ev_Hyper
Заблокирован
10.11.2015, 15:02 #2
Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение

Цитата Сообщение от alkov03 Посмотреть сообщение
Как обратиться к конкретному участнику? Например к 8-му из 35-и.
C#
1
2
            int code = 0;
            var first = xd.Root.Elements("Участник").First(x => (int)x.Attribute("Код_участника") == code);
Цитата Сообщение от alkov03 Посмотреть сообщение
Как удалить конкретного участника?
Remove

Цитата Сообщение от alkov03 Посмотреть сообщение
Как в цикле for перебирать весь список участников? Можно ли это сделать подобно классической работе с массивом?
alkov03, можно. Но не нужно.

Цитата Сообщение от alkov03 Посмотреть сообщение
Как изменить данные конкретной записи?
SetAttributeValue, SetElementValue

Сразу небольшой пример для ваших данных по текущим вопросам:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
            string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Участники>
  <Участник Код_участника=""0"">
    <Имя>Иванов Иван Иванович</Имя>
    <Пол>Мужской</Пол>
    <Дата_рождения>1990-1-1</Дата_рождения>
    <Регион>Москва</Регион>
    <Звание_разряд>МС</Звание_разряд>
    <Тренер>Петров П. П.</Тренер>
  </Участник>
  <Участник Код_участника=""1"">
    <Имя>Сидоров Семен Семеныч</Имя>
    <Пол>Мужской</Пол>
    <Дата_рождения>2015-11-6</Дата_рождения>
    <Регион>Саратов</Регион>
    <Звание_разряд>КМС</Звание_разряд>
    <Тренер>Егоров Е. Е.</Тренер>
  </Участник>
</Участники>
";
            XDocument xd = XDocument.Parse(xml);
            var code = 0;
            var first = xd.Root.Elements("Участник").First(x => (int)x.Attribute("Код_участника") == code);
            Console.WriteLine("Запись для удаления");
            Console.WriteLine(first);
            first.Remove();
            var newname = "Дим Димыч";
            var newcode = 0;
            var somerecord = xd.Root.Element("Участник");
            somerecord.SetAttributeValue("Код_участника", newcode);
            somerecord.SetElementValue("Имя", newname);
            Console.WriteLine("После изменений");
            Console.WriteLine(xd);
Вывод:
Код
Запись для удаления
<Участник Код_участника="0">
  <Имя>Иванов Иван Иванович</Имя>
  <Пол>Мужской</Пол>
  <Дата_рождения>1990-1-1</Дата_рождения>
  <Регион>Москва</Регион>
  <Звание_разряд>МС</Звание_разряд>
  <Тренер>Петров П. П.</Тренер>
</Участник>
После изменений
<Участники>
  <Участник Код_участника="0">
    <Имя>Дим Димыч</Имя>
    <Пол>Мужской</Пол>
    <Дата_рождения>2015-11-6</Дата_рождения>
    <Регион>Саратов</Регион>
    <Звание_разряд>КМС</Звание_разряд>
    <Тренер>Егоров Е. Е.</Тренер>
  </Участник>
</Участники>
https://dotnetfiddle.net/RokxL6

Цитата Сообщение от alkov03 Посмотреть сообщение
Все, что находил в интернете либо не то, либо запутанно, и новичку в этом деле не разобраться.
Joseph Rattz , Adam Freeman - "Pro LINQ - Language Integrated Query in C#"
Хорошая книга о Linq, там есть глава посвященная Linq2Xml - все очень просто и доступно. Есть на русском языке.
1
alkov03
1 / 1 / 2
Регистрация: 26.04.2015
Сообщений: 19
10.11.2015, 18:46  [ТС] #3
Спасибо, буду разбираться.

А разве этот код не заменит все записи участников?
C#
1
2
3
var somerecord = xd.Root.Element("Участник");
somerecord.SetAttributeValue("Код_участника", newcode);
somerecord.SetElementValue("Имя", newname);
Правильнее было бы так, я правильно понимаю?
C#
1
var somerecord = xd.Root.Element("Участник").First(x => (int)x.Attribute("Код_участника") == *Нужный участник*);
0
Ev_Hyper
Заблокирован
10.11.2015, 20:26 #4
Цитата Сообщение от alkov03 Посмотреть сообщение
А разве этот код не заменит все записи участников?
alkov03, нет, только одного. Посмотрите на определение метода Element - он вернет первый дочерний элемент с именем XName.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2015, 20:26
Привет! Вот еще темы с решениями:

Возможная прибыль. linq to xml
Здравствуйте! Есть два файла: 1)Товары -код (уникальный) -название...

LINQ to XML: использование атрибутов
привет всем, нужна помощь, в шарпе не силён есть вот такой кусок кода:...

Linq и xml (добавить элемент)
Здравствуйте, помогите пожалуйста люди добрые. Имеется xml файл со следующим...

Xml.linq: проверка существования элемента
Всем привет, кто знает, как проверить наличие элемента в файле xml с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru