Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64

Работа с XML файлом: Добавить новый элемент в элемент находящийся в элементе

17.07.2024, 17:14. Показов 1815. Ответов 30
Метки xml (Все метки)

Студворк — интернет-сервис помощи студентам
Есть база данных на Xml, в ней при регистрации пользователя создается 1 элемент название Взвода и 2 Элемент вложенный в первый данные об учащемся. по итогу прохождения программы во 2 элемент должен добавится(вложиться) 3 элемент (баллы которые получил участник )
как примерно выглядят Элементы в Xml
XML
1
2
3
  <otdelenie Vzvod="432">
    <surname>Петров  Пётр Сергеевич</surname>
  </otdelenie>
как выглядит код для добавления 3 элемента, в строчке с
C#
1
surElem.AppendChild(Rez);
ошибка в surElem ==0
вот она
C#
1
2
3
System.NullReferenceException: "Object reference not set to an instance of an object."
 
surElem было null.
вот сам отрывок кода
C#
1
2
3
4
5
6
7
8
9
10
11
XmlElement otdElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//otdelenie[@Vzvod='" + data.Vzvod + "']");
 
XmlElement surElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//surname[@Vzvod='" + data.FullName + "']");
 
 
XmlElement Rez = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//Rezultat[@Rezult='" + rez + "']");
 
Rez = data.xml.CreateElement("Rezult");
Rez.InnerText = rez.ToString();
surElem.AppendChild(Rez);
data.xml.Save(data.location + @"rep.xml");
спасибо за помощ
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2024, 17:14
Ответы с готовыми решениями:

Как передвигать указатель чтобы выделить память под новый элемент и добавить новый элемент в массив?
Допустим есть некое условие,нам нужно при каждом его выполнении выделить память под новый элемент и добавить его в массив. Вопрос:Как...

Добавить новый элемент и параметр в существующий XML файл
Добрый всем день! Как добавить в XML новую строку вида &lt;pattern name=&quot;value&quot; /&gt; &lt;?xml version=&quot;1.0&quot;...

Удалить из списка очереди первый элемент, добавить новый элемент на последнее место
1.Создать односвязный список типа стек. Скопировать его в другой список типа очередь. Удалить из списка очереди первый элемент, добавить...

30
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
17.07.2024, 21:35
Лучший ответ Сообщение было отмечено Bond-007 как решение

Решение

Ошибка в этой строке:
Цитата Сообщение от Bond-007 Посмотреть сообщение
C#
3
XmlElement surElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//surname[@Vzvod='" + data.FullName + "']");
Это строка пытается найти элемент с именем surname у которого значение атрибута Vzvod равно значению переменной data.FullName. Во-первых, у элементов surname нет атрибута Vzvod. Поэтому SelectSingleNode возвращает null. Во-вторых, вам нужен не первый в порядке документа элемент surname, а элемент surname внутри определенного элемента otdelenie.

Нужно так:
C#
3
XmlElement surElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//otdelenie[@Vzvod='" + data.Vzvod + "']/surname[text()='" + data.FullName + "']");
Или, чтобы упростить код, можно искать в уже найденом элементе otdelenie
C#
3
XmlElement surElem = (XmlElement)otdElem.SelectSingleNode("surname[text()='" + data.FullName + "']");
P.S. Я вам уже советовал использовать Xml сериализацию. Вы напрасно проигнорировали его. С ней код станет проще.

P.P.S. Судя по ошибке вы не знаете (забыли?) правильный синтаксис XPath выражений. Не стесняйтесь пользоваться справочником по XPath в таких случаях. В интернете их более чем достаточно. Сами себе же время съэкономите.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
18.07.2024, 11:34  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
P.S. Я вам уже советовал использовать Xml сериализацию. Вы напрасно проигнорировали его. С ней код станет проще.
при сериализации, нельзя работать с конкретным элементом, нужно будет каждый раз открывать файл и по всему ему проходить, мне же нужен всего 1 элемент во время работы программы ( пользователя, который вошёл или зарегестрировался)

Добавлено через 1 час 56 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
XmlElement surElem = (XmlElement)otdElem.SelectSingleNode("su rname[text()='" + data.FullName + "']");
так, теперь оно выдает ошибку что surElem пусто, при создании нового otdElem ( при работе с уже созданными ошибки нет )
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
18.07.2024, 11:56
Цитата Сообщение от Bond-007 Посмотреть сообщение
так, теперь оно выдает ошибку что surElem пусто, при создании нового otdElem ( при работе с уже созданными ошибки нет )
Показывайте код.

Добавлено через 1 минуту
Цитата Сообщение от Bond-007 Посмотреть сообщение
при сериализации, нельзя работать с конкретным элементом, нужно будет каждый раз открывать файл и по всему ему проходить,
1) Можно 2) Каждый раз открывать файл не требуется

Цитата Сообщение от Bond-007 Посмотреть сообщение
мне же нужен всего 1 элемент во время работы программы ( пользователя, который вошёл или зарегестрировался)
Судя по коду который вы привели вам требуется не только это.
1
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
18.07.2024, 12:18  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Показывайте код.
Вот само создание Профиля
C#
1
2
3
4
5
6
7
8
9
10
11
 XmlElement otdElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//otdelenie[@Vzvod='" + data.Vzvod + "']");
 data.Vzvod = (VzvodW.Text).ToString();
 otdElem = data.xml.CreateElement("otdelenie");
 otdElem.SetAttribute("Vzvod",   data.Vzvod);
 data.element.AppendChild(otdElem);
 XmlElement surElem = data.xml.CreateElement("surname");
 
 surElem.InnerText = Surname.Text + " " + Name.Text + " " + MiddleName.Text;
 otdElem.AppendChild(surElem);
      
 data.xml.Save(data.location + @"rep.xml");
Вот код после прохождения теста (который мы дорабатывали и в котором возникает ошибка 12 строка
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 data.location = Assembly.GetExecutingAssembly().Location.ToString();
 data.location = data.location.Remove(data.location.Length - 27, 27);
 data.location += @"Dan\";
 data.xml = new XmlDocument();
 data.xml.Load(data.location + @"rep.xml");
 data.element = data.xml.DocumentElement;
 int count = data.xml.DocumentElement.ChildNodes.Count;
 XmlElement otdElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//otdelenie[@Vzvod='" + data.Vzvod + "']");
 
 
 
XmlElement surElem = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//otdelenie[@Vzvod='" + data.Vzvod + "']/surname[text()='" + data.FullName + "']");
 
 
 XmlElement Rez = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//Rezultat[@Rezult='" + rez + "']");
 
 Rez = data.xml.CreateElement("Rezult");
 Rez.InnerText = rez.ToString();
 surElem.AppendChild(Rez);
 data.xml.Save(data.location + @"rep.xml");
 this.Close();
Добавлено через 18 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Судя по коду который вы привели вам требуется не только это.
1 элемент со всеми его данными )
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
18.07.2024, 13:47
Цитата Сообщение от Bond-007 Посмотреть сообщение
Вот само создание Профиля
Первая строка не имеет смысла. Зачем искать элемент если вы все равно создаете новый?

Цитата Сообщение от Bond-007 Посмотреть сообщение
Вот код после прохождения теста (который мы дорабатывали и в котором возникает ошибка 12 строка
Какая именно ошибка возникает в строке №12?

Цитата Сообщение от Bond-007 Посмотреть сообщение
C#
15
XmlElement Rez = (XmlElement)data.xml.DocumentElement.SelectSingleNode("//Rezultat[@Rezult='" + rez + "']");
Похоже вы продолжаете бездумно применять // селектор. Хотя в данном случае это не создает проблему т.к. переменная Rez сразу перезаписывается (в строке №17).

Добавлено через 1 минуту
Цитата Сообщение от Bond-007 Посмотреть сообщение
1 элемент со всеми его данными )
Это не имеет большого значения. Все равно удобнее работать с классом чем напрямую с XML. Ваш код это ясно демонстрирует.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
18.07.2024, 16:34  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Первая строка не имеет смысла. Зачем искать элемент если вы все равно создаете новый?
Такой взвод уже может быть ( они могут повторяться ) и если он есть, то и программа работает без ошибки, а когда создаю новый то появляется

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Какая именно ошибка возникает в строке №12?
C#
1
2
3
System.NullReferenceException: "Object reference not set to an instance of an object."
 
surElem было null.
Добавлено через 5 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Похоже вы продолжаете бездумно применять // селектор.
Да, не до конца понял как он должен работать, правильно ли теперь выглядит ?
C#
1
XmlElement Rez = (XmlElement)data.xml.DocumentElement.SelectSingleNode("/Rezultat['" + rez + "']");
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
18.07.2024, 17:36
Цитата Сообщение от Bond-007 Посмотреть сообщение
Такой взвод уже может быть ( они могут повторяться ) и если он есть, то и программа работает без ошибки, а когда создаю новый то появляется
Да, при чем тут это. Вы объявляете переменную, присваиваете ей значение и сразу же присваиваете другое значение. Вопрос - зачем делать первое присвоение? Ответ - незачем. Так понятно?

Цитата Сообщение от Bond-007 Посмотреть сообщение
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Какая именно ошибка возникает в строке №12?
System.NullReferenceException: "Object reference not set to an instance of an object."
Вы что-то путаете. В строке №12 такой ошибки быть не может.

Цитата Сообщение от Bond-007 Посмотреть сообщение
Да, не до конца понял как он должен работать, правильно ли теперь выглядит ?
C#
1
XmlElement Rez = (XmlElement)data.xml.DocumentElement.SelectSingleNode("/Rezultat['" + rez + "']");
Это зависит от структуры документа. Если элемент Rezultat (кстати говоря, использование транслита плохая идея) находится в корне документа, то правильно. Если нет, то неправильно.
1
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
19.07.2024, 09:12  [ТС]
Цитата Сообщение от Bond-007 Посмотреть сообщение
surElem.AppendChild(Rez);
Извиняюсь, вот строка с ошибкой

Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если элемент Rezultat (кстати говоря, использование транслита плохая идея) находится в корне документа, то правильно.
я так понимаю в корне находится только элемент взвод потом в нем ---> находится элемент данных пользователя и уже после в эелементе данных пользователя ---> находится элемент результ
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
19.07.2024, 09:25
Цитата Сообщение от Bond-007 Посмотреть сообщение
Извиняюсь, вот строка с ошибкой
Значит искомый элемент отсутствует в документе. Обработайте этот случай.

Цитата Сообщение от Bond-007 Посмотреть сообщение
я так понимаю в корне находится только элемент взвод потом в нем ---> находится элемент данных пользователя и уже после в эелементе данных пользователя ---> находится элемент результ
Отразите это в XPath значит - /otdelenie[@Vzvod='имя']/surname[text()='ФИО']/Rezultat[@Rezult='результат'].

Мне кажется что на этом этапе следует снова задуматься а так ли удобен XML для работы с данными? Может было бы проще если бы код работал с моделью данных?
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
19.07.2024, 09:38  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Мне кажется что на этом этапе следует снова задуматься а так ли удобен XML для работы с данными? Может было бы проще если бы код работал с моделью данных?
Вы про SQlite ? я уже сам начинаю задумываться, но по факту для работы программы осталось не много и думаю уже нужно так доделывать
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
19.07.2024, 09:41
Цитата Сообщение от Bond-007 Посмотреть сообщение
Вы про SQlite ?
Нет. Я про классы которые описывают модель данных с которыми вы работаете.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
19.07.2024, 09:42  [ТС]
OwenGlendower, извините пожалуйста, на могли бы глянуть вот этот вопрос, пожалуйста Как сделать выборку из внутренних элементов

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нет. Я про классы которые описывают модель данных с которыми вы работаете
что за классы сериализация ? я не понимаю, ме кажется я не о том думаю
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
19.07.2024, 10:21
Цитата Сообщение от Bond-007 Посмотреть сообщение
что за классы
Обычные классы:
C#
1
2
3
4
5
6
7
8
9
10
11
class Otdelenie
{
    public string Vzvod { get; set; }
    public List<Surname> Surnames { get; set; } = new();
}
 
class Surname
{
    public string FIO { get; set; }
    public List<string> Results { get; set; } = new();
}
Цитата Сообщение от Bond-007 Посмотреть сообщение
сериализация
Уже давал ссылку
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
19.07.2024, 10:50  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Обычные классы:
Я их использую
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
19.07.2024, 11:04
Цитата Сообщение от Bond-007 Посмотреть сообщение
Я их использую
Не заметно
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
13.11.2024, 17:08  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
/otdelenie[@Vzvod='имя']/surname[text()='ФИО']/Rezultat[@Rezult='результат'].
доброго времени суток, я понял о чём, тут шла речь, у Результата, нет никакого атрибута, каким образом к нему тогда обратиться ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
13.11.2024, 17:54
Bond-007, если текст находится внутри элемента, то используйте функцию text(), иначе показывайте структуру своего XML.

P.S. Вы писали что пользуетесь классами. Если так, то зачем вам xpath?
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
13.11.2024, 18:41  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вы писали что пользуетесь классами. Если так, то зачем вам xpath?
В классах хранятся только данные о рабочем пользователе ( который в начале зашел) всё остальное постоянно берется из файла и в случае чего проверяется

Добавлено через 39 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
то используйте функцию text(), иначе показывайте структуру своего XML.
при такой формуле выдает ошибку
C#
1
                XmlNode NameEl = (XmlElement?)data.xml.DocumentElement.SelectSingleNode("//otdelenie[@Vzvod='" + data.Vzvod + "']/Name[text()='" + data.FuulName + "']");
Вот Xml
XML
1
2
3
 <otdelenie Vzvod="2">
   <Name>2 2 2</Name>
 </otdelenie>
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
13.11.2024, 20:57
Bond-007, что мешает брать
Цитата Сообщение от Bond-007 Посмотреть сообщение
В классах хранятся только данные о рабочем пользователе ( который в начале зашел) всё остальное постоянно берется из файла и в случае чего проверяется
А хранили бы все данные и проблем бы меньше было.

Цитата Сообщение от Bond-007 Посмотреть сообщение
при такой формуле выдает ошибку
Какую?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2024, 20:57
Помогаю со студенческими работами здесь

Функция: добавить новый элемент в начало списка, если элемент с таким значением не существует
Задание у меня такое, никак не могу с ним справится.. помогите, пожалуйста, кто может Напишите функцию, которая добавляет новый...

Функция: добавить новый элемент в начало списка, если элемент с таким значением не существует
Задание у меня такое, никак не могу с ним справится.. помогите, пожалуйста, кто может :( Напишите функцию, которая добавляет новый...

Удалить из списка заданный элемент, добавить в конец новый элемент, напечатать список в обратном порядке
Прошу помощи! Пусть дан циклический двунаправленный список, с информативным полем - целое число: а) удалить из списка первый...

Удалить элемент из списка и добавить новый элемент
Здравствуйте уважаемые!! Помогите пожалуйста! Создать список из 10 идентификаторов с длинной каждого 5 символов и удалить к-ый элемент...

Добавить в начало списка новый элемент со значением D1, а конец - новый элемент со значением D2
Помогите пожалуйста!... Даны числа D1 и D2 и указатель Р0 на один из элементов непустого двосвязного списка. Добавить в начало списка новый...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru