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

Как в уже созданный атрибут дополнить новыми данными?

20.12.2023, 18:31. Показов 5682. Ответов 56
Метки xml (Все метки)

Студворк — интернет-сервис помощи студентам
вот текст программы в которой в загруженный файл, сохраняю новые значения из (боксов)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
XmlDocument^ xmlDocument = gcnew XmlDocument();
                xmlDocument->Load("rep.xml");
                XmlElement^ xRoot = xmlDocument->DocumentElement;
 
                XmlElement^ otdElem = xmlDocument->CreateElement("otdelenie");        // отделение
                    XmlAttribute^ otdAttr = xmlDocument->CreateAttribute("otd");
                        XmlElement^ surElem = xmlDocument->CreateElement("surname");    // фамилия,имя и отчество
                            
                            String^ otd = comboBox1->Text;
                            String^ surn = textBox1->Text + " " + textBox2->Text + " " +textBox3->Text;
                        XmlText^ otdText = xmlDocument->CreateTextNode(otd);
                        XmlText^surnText = xmlDocument->CreateTextNode(surn);
                    otdAttr->AppendChild(otdText);
                    surElem->AppendChild(surnText);
                otdElem->Attributes->Append(otdAttr);
                otdElem->AppendChild(surElem);
                xRoot->AppendChild(otdElem);
                xmlDocument->Save("rep.xml");
Вопрос в том как мне сделать ( если я знаю что отделение одно и тоже, что бы в отделение и записывала, а не новый елемент.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2023, 18:31
Ответы с готовыми решениями:

Дополнить новыми строками уже существующий текстовый файл
Дополнить новыми строками уже существующий текстовый файл. Для выбора имени файла использовать компонент OpenDialog. Окно...

Можно ли уже созданный DGV с колонками, заполнить данными
А подскажите, можно ли уже созданный грид с колонками, заполнить данными, т.е. я программно создаю датасет адптер и т.д., на форме есть...

Переменная не перезаписывается новыми данными, а дополняется новыми значениями
Всем привет, занимаюсь понемногу питоном на яндексе. Собственно вопрос, есть такой код. Почему переменная bunny_counter не перезаписывается...

56
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
11.01.2024, 18:38  [ТС]
Студворк — интернет-сервис помощи студентам
а форму на Avolonia возможно достать ?
0
 Аватар для Andrey-MSK
3314 / 2201 / 387
Регистрация: 14.08.2018
Сообщений: 7,404
Записей в блоге: 4
11.01.2024, 20:49
Цитата Сообщение от Bond-007 Посмотреть сообщение
а форму на Avolonia возможно достать ?
https://avaloniaui.net/GettingStarted - Удачи в изучении.

Добавлено через 43 секунды
Bond-007, https://docs.avaloniaui.net/docs/welcome
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
12.01.2024, 10:13  [ТС]
понял, спасибо, извиняюсь, что такой поток вопросов был
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
01.02.2024, 17:33  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
String^ otd = comboBox1->Text;
XmlElement^ otdElem = dynamic_cast<XmlElement^>(xmlDocument->DocumentElement->SelectSingleNode("//otdelenie[@otd='" + otd + "']"));
if (otdElem == nullptr) {
    otdElem = xmlDocument->CreateElement("otdelenie");        // отделение
    otdElem->SetAttribute("otd", otd);
    xRoot->AppendChild(otdElem);
}
 
XmlElement^ surElem = xmlDocument->CreateElement("surname");    // фамилия,имя и отчество
surElem->InnerText = textBox1->Text + " " + textBox2->Text + " " +textBox3->Text;
otdElem->AppendChild(surElem);
 
xmlDocument->Save("rep.xml");
как можно подобное реализовать на C# ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
01.02.2024, 17:40
Цитата Сообщение от Bond-007 Посмотреть сообщение
как можно подобное реализовать на C# ?
Точно так же. Убираем ^, меняем -> на ., dynamic_cast на явное приведение типа, nullptr на null. И дело в шляпе.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
01.02.2024, 17:52  [ТС]
C#
1
2
3
4
5
6
XmlDocument xml = new XmlDocument();
xml.Load(@"C:\Users\User\Desktop\BOND\sample01.xml");
XmlElement element = xml.DocumentElement;
Name = TTT.Text;
if()
XmlElement otdElem = (double) XmlElement(xml.DocumentElement.SelectSingleNode("//otdelenie[@otd='" + otd + "']"))
Вот так сейчас выглядит программа, не понимаю как или в какой тип данных нужно явное приведение и после XmlElement нужны ли скобки.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
01.02.2024, 23:19
Цитата Сообщение от Bond-007 Посмотреть сообщение
не понимаю как
Code
1
(ИмяТипа)выражение
Цитата Сообщение от Bond-007 Посмотреть сообщение
в какой тип данных нужно явное приведение
XmlElement

Цитата Сообщение от Bond-007 Посмотреть сообщение
после XmlElement нужны ли скобки.
Одна скобка лишняя.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
02.02.2024, 15:38  [ТС]
Вот итоговый код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 {
     XmlDocument xml = new XmlDocument();
     xml.Load(@"C:\Users\User\source\repos\AvaloniaApplication8\AvaloniaApplication8\rep.xml");
     XmlElement element = xml.DocumentElement;
     Vzvod = TTT.Text;
     XmlElement otdElem = (XmlElement) xml.DocumentElement.SelectSingleNode("//otdelenie[@otd='" + Vzvod + "']") ;
     if (otdElem != null)
     {
         otdElem = xml.CreateElement("otdelenie");
         otdElem.SetAttribute("Vzvod", Vzvod);
         element.AppendChild(otdElem);
     }
         XmlElement surElem = xml.CreateElement("surname");
         surElem.InnerText = rrr.Text;
         [B]otdElem.AppendChild(surElem);[/B]
         xml.Save(@"C:\Users\User\source\repos\AvaloniaApplication8\AvaloniaApplication8\rep.xml");
     
  
 }
при активации выдает ошику на выделенном элементе
Вот ошибка
"System.NullReferenceException: "Object reference not set to an instance of an object."

otdElem было null."
ну и почему-то не получилось вставить обьект из папки файла и пришлось писать весь путь к файлу
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
02.02.2024, 18:22
Bond-007, в строке №7 неверное условие.
Кликните здесь для просмотра всего текста
вместо != должно быть ==
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
21.03.2024, 18:56  [ТС]
Цитата Сообщение от Bond-007 Посмотреть сообщение
XmlElement otdElem = (XmlElement) xml.DocumentElement.SelectSingleNode("//otdelenie[@otd='" + Vzvod + "']") ;
Как можно проверить, есть ли такой элемент или нет ? до этого я вписывал зная что он есть, а теперь мне нужно определить, если такой элемент и если его нет то действовать по другому
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
21.03.2024, 19:11
Цитата Сообщение от Bond-007 Посмотреть сообщение
Как можно проверить, есть ли такой элемент или нет ?
C#
1
2
3
4
5
6
7
8
if (otdElem == null)
{
    // Элемента нет
}
else
{
    // Элемент есть
}
Добавлено через 2 минуты
P.S. Если бы вы прочитали документацию на метод SelectSingleNode, то вопрос отпал бы сам собой т.к. там написано что метод возвращает null, если элемент не найден.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
22.03.2024, 18:29  [ТС]
Цитата Сообщение от Bond-007 Посмотреть сообщение
XmlElement^ otdElem = dynamic_cast<XmlElement^>(xmlDocument->DocumentElement->SelectSingleNode("//otdelenie[@otd='" + otd + "']"));
как можно сделать подобное на елемент который внутри этого?

Добавлено через 40 секунд
вот как он выглядит в xml
XML
1
2
3
4
5
6
<otdelenie Vzvod="329">
    <surname>sfe</surname>
    <surname>qwe</surname>
    <surname>tyui</surname>
    <surname>22222</surname>
  </otdelenie>
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
22.03.2024, 21:02
Bond-007, строка которая передается в SelectSingleNode называется XPath. Прочитайте документацию и вопросы отпадут.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
11.04.2024, 18:33  [ТС]
может я не ту документацию нашёл. у меня есть список в xml файле у него в каждый элемент это число вопроса по списку и то есть атрибуты у него идут 1,2,3 и т.д. вот он
XML
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<Dani>
  <Vopros Chislo="1">
    <TextName>вопрос1</TextName>
  </Vopros>
<Vopros Chislo="2">
    <TextName>вопрос2</TextName>
  </Vopros>
 
</Dani>
я могу отобрать нужный мне вопрос по данному запросу (где Item это класс)
C#
1
 XmlElement Vopros = (XmlElement)Item.xml.DocumentElement.SelectSingleNode("//Vopros[@Chislo='" + Item.Ita + "']");
в каждом элементе есть один, единственный атрибут, содержащий вопрос, как взять этот вопрос я не понял, я знаю что есть перебор , но у меня им не получилось и мне кажется это излишняя нагрузка на систему и лишняя часть кода
вот она : (Osnova.text - это текст блок в котором будет текст)
C#
1
2
3
4
5
 foreach( XmlNode xnode in Item.element)
 {
     XmlNode TextName = xnode.Attributes.GetNamedItem("TextName");
     Osnova.Text = TextName.Value;
 }
помогите пожалуйста
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
11.04.2024, 22:23
Цитата Сообщение от Bond-007 Посмотреть сообщение
помогите пожалуйста
1. Старайтесь избегать конструкции //. Она означает поиск на любом уровне и приводит к лишней работе.
2. Сам поиск несложно организовать. Если элементы Vopros и TextName вам нужны по отдельности, то:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string xml =
    """
    <?xml version="1.0" encoding="UTF-8"?>
    <Dani>
      <Vopros Chislo="1">
        <TextName>вопрос1</TextName>
      </Vopros>
    <Vopros Chislo="2">
        <TextName>вопрос2</TextName>
      </Vopros>
     
    </Dani>    
    """;
XmlDocument xmlDoc = new();
xmlDoc.LoadXml(xml);
 
int chislo = 2;
XmlElement Vopros = (XmlElement)xmlDoc.DocumentElement.SelectSingleNode("Vopros[@Chislo='" + chislo + "']");
if (Vopros != null)
{
    XmlElement TextName = Vopros["TextName"];
    string question = TextName.InnerText;
}

Если нужен только текст вопроса, то
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string xml =
    """
    <?xml version="1.0" encoding="UTF-8"?>
    <Dani>
      <Vopros Chislo="1">
        <TextName>вопрос1</TextName>
      </Vopros>
    <Vopros Chislo="2">
        <TextName>вопрос2</TextName>
      </Vopros>
     
    </Dani>    
    """;
XmlDocument xmlDoc = new();
xmlDoc.LoadXml(xml);
 
int chislo = 2;
string? question = xmlDoc.DocumentElement.SelectSingleNode("Vopros[@Chislo='" + chislo + "']/TextName")?.InnerText;

В обоих примерах игнорируйте строки с 1 по 16. Они мне нужны чтобы иметь xml нужной структуры.

Цитата Сообщение от Bond-007 Посмотреть сообщение
каждый элемент это число вопроса по списку и то есть атрибуты у него идут 1,2,3
Это плохая идея. Элементы в XML нумеруются автоматически. Ручная нумерация плохя тем чтобы нельзя просто так переставить вопросы местами или вставить новый вопрос в середину - всегда потребуется вручную менять номера вопросов. Лучше сделать так (примеры уже без строк 1..16):
C#
1
2
3
4
5
6
7
int questionNumber = 2;
XmlElement Vopros = (XmlElement)xmlDoc.DocumentElement.SelectSingleNode("Vopros[" + questionNumber + "]");
if (Vopros != null)
{
    XmlElement TextName = Vopros["TextName"];
    string question = TextName.InnerText;
}
C#
1
2
int questionNumber = 2;
string? question = xmlDoc.DocumentElement.SelectSingleNode("Vopros[" + questionNumber + "]/TextName")?.InnerText;
Цитата Сообщение от Bond-007 Посмотреть сообщение
может я не ту документацию нашёл
Что значит "нашел не ту документацию" когда я привел одну конкретную ссылку?

P.S. На будущее - будьте добры задавать вопросы по C# в разделе по C#, а не по C++/CLI.
0
0 / 0 / 0
Регистрация: 08.11.2023
Сообщений: 64
12.04.2024, 16:00  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Ручная нумерация плохя тем чтобы нельзя просто так переставить вопросы местами или вставить новый вопрос в середину - всегда потребуется вручную менять номера вопросов
у меня данный xml используется как база из которой только берутся данные, она не добавляется из программы, но думаю если мне нужно будет добавить, уже я смогу это сделать
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Что значит "нашел не ту документацию" когда я привел одну конкретную ссылку?
не заметил, моя ошибка
Цитата Сообщение от OwenGlendower Посмотреть сообщение
P.S. На будущее - будьте добры задавать вопросы по C# в разделе по C#, а не по C++/CLI.
понял, извиняюсь
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
12.04.2024, 16:08
Цитата Сообщение от Bond-007 Посмотреть сообщение
у меня данный xml используется как база из которой только берутся данные, она не добавляется из программы, но думаю если мне нужно будет добавить, уже я смогу это сделать
Конечно сможете, но зачем усложнять себе задачу? Как по мне, явный номер является лишним.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2024, 16:08
Помогаю со студенческими работами здесь

Как заполнить QLineEdit новыми данными?
Решил попробовать создать несколько простых интерфейсов на qt в образовательных целях. Читаю книги, въезжаю в логику. Столкнулся с...

Как перезапустить программу с новыми данными из textBox
Что я делаю: Делаю игру сапер и там можно выбирать размер поля (высота и ширина) и нажать старт. Пока только поля прорисовываются и то...

Как проверить результаты кластеризации самоорганизующейся карты Кохонена с новыми данными
Здравствуйте. Есть экселевский документ где находится выборка 14 значений (первые 7 односятся к первому кластеру), а другие 7 ко второму. ...

Файл: Подскажите, как взять вторую строку и перезаписать новыми данными, стерев предыдущие.
Добрый вечер. У меня есть файл из нескольких строк. Подскажите, как мне взять вторую строку и перезаписать своими новыми данными, стерев...

Как рассчитать разницу между новыми введенными данными в EditText и старыми и вывести результат в Textview?
Ребят нужна помощь, я только начал изучать андроид, собственно в своем приложении мне нужно чтобы новые введённые данные в EditText...


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

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru