Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220

Добавление дочернего элемента в XML

13.10.2014, 11:02. Показов 3736. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно сразу покажу часть кода
C++
1
2
3
4
5
6
7
8
9
10
_di_IXMLDocument  XMLDocument= NewXMLDocument();
 XMLDocument->LoadFromFile(FileName);
 IXMLNode *node, *nodeDiscret, *nodeRoot;
  try
  {
    node=XMLDocument->DocumentElement;
    nodeDiscret = node->AddChild("Discrete");
    for (int i = 0; i < Result->RowCount-1; i++)
    {
    IXMLNode *nodNew =nodeDiscret->AddChild("D");
Тоесть я загружаю файл не пустой, нахожу в нем корневой элемент, и пытаюсь создать от корневого дочерний, притом что там уже есть дочерний тоесть загружаю файл с структурой
XML
1
2
3
<RAP>
   <Analog>
          <A Name />
и далее хочу добавить к узлу RAP вот чтоб так было
XML
1
2
3
4
5
6
7
8
<RAP>
   <Analog>
          <A Name />
   </Analog>
 
   <Discrete>
          <D Name />
   </Discrete>
что я не так творю

Добавлено через 51 минуту
Ок все вроде норм но, при последующей загрузке надо как то очищать этот подузел иначе он добавляется при каждой загрузке.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2014, 11:02
Ответы с готовыми решениями:

Поиск последнего дочернего элемента и добавление следующего в xml-документе
По наработкам: для всех элементов item вставить schema, если последний из дочерних элементов item-a = title. Xml вида: &lt;?xml...

Проверка на существование дочернего элемента в xml
Здравствуйте. Можно ли при помощи SimpleXML проверить существует ли дочерний тег? Например есть XML документ: &lt;xml&gt; ...

Не срабатывает рендер у дочернего элемента дочернего элемента(не тавтология)
Не срабатывает рендер у дочернего элемента дочернего элемента(не тавтология) https://gitlab.com/Kir1/redux.git Ветка two-child При...

19
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
13.10.2014, 11:02
А с чего ты решил, что что-то не так в приведенном куске кода? Просто тот XML, который ты привел, не является правильным, поэтому и не обрабатывается _di_IXMLDocument-ом. Было бы:
XML
1
2
3
4
5
<RAP>
  <Analog>
    <A Name="" />
  </Analog>
</RAP>
- все бы отработало прекрасно...
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
13.10.2014, 11:24  [ТС]
Да все прекрасно, но теперь проблема в другом, добавляет узел каждый раз при загрузке, поэтому делаю так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 try
  {
    node=XMLDocument->DocumentElement;
    nodeSub=node->ChildNodes->FindNode("Discrete");
    if(!nodeSub)
    {
    nodeDiscret = node->AddChild("Discrete");
     for (int i = 0; i < Result->RowCount-1; i++)
     {
      IXMLNode *nodNew =nodeDiscret->AddChild("D");
     }
    }
    else
    {
       for (int i = 0; i < Result->RowCount-1; i++)
       {
        IXMLNode *nodNew =nodeDiscret->AddChild("D");
       }
    }
    XMLDocument->SaveToFile(FileName);
    XMLDocument->Active = false;
вот при добавлении с уже имеющимся узлом, в ветке else почему то выводит неверно, только последнюю строку переписывает в первую, но кажется я понял в чем беда
Вообщем надо переписать записи, но пока незнаю как

Добавлено через 6 минут
Вопрос открыт непойму как переписать записи, выводит только последнюю строку в первую
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
13.10.2014, 11:28
Ну, так удаляй все дочерние ноды, и создавай заново столько, сколько нужно в этот раз:
C++
1
2
3
4
5
6
7
8
    else
    {
       // удаляешь дочерние элементы в цикле через nodeSub->ChildNodes->Delete("D");
       for (int i = 0; i < Result->RowCount-1; i++)
       {
        IXMLNode *nodNew =nodeSub->AddChild("D");
       }
    }
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
13.10.2014, 11:36  [ТС]
node->ChildNodes->Delete("Discrete");
nodeDiscret = node->AddChild("Discrete");
вот где-то так надо, ваш код немного не подходит но смысл ясен,спасибо
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
13.10.2014, 11:38
Вот так не надо, надо удалить все, и потом перезаписать заново:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    else
    {
        // удаляешь дочерние элементы в цикле через
        int index = -1;
        do
        {
            index = nodeSub->ChildNodes->Delete("D");
        }
        while (index > -1);
 
        for (int i = 0; i < Result->RowCount - 1; i++)
        {
            IXMLNode *nodNew = nodeSub->AddChild("D");
        }
    }
, это обезопасит тебя от случаев, когда количество строк грида не совпадает с текущим числом дочерних элементов у <Discrete>
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
13.10.2014, 11:42  [ТС]
Так если я удалю весь узел discret а потом его перепишу, разве это не обезопасит
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
13.10.2014, 11:51
Лишняя работа, зачем удалять узел, если он и так есть. Ну, решать тебе... Делай как знаешь, тебе что-то советовать - себе дороже выходит. Упрутся, сделают по-своему, потом прибегают в мыле: "АААААА!!! СПАСИТЕ!!!! НЕ РАБОТАЕТ"
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
13.10.2014, 12:00  [ТС]
В принципе согласен, спс
0
13.10.2014, 15:16

Не по теме:

Есть еще такая тема, на заметку Переименование узла TXMLDocument

0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
05.11.2014, 10:08  [ТС]
Чтобы не плодить много тем, продолжу здесь,Может кто объяснит почему XML документ по разному отображается, тоесть смотрю файл через браузер все четко, через текстовый документ смотрю дочерние узлы смещены, правильно но некрасиво
XML
1
2
3
4
5
6
7
8
<RAP>
        <Analog>
               <A Name="" />
         </Analog>
        <Discrete>
    <D Name="" />
  </Discrete>
</RAP>
Добавлено через 23 часа 49 минут
Уже решено можете не отвечать
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
06.11.2014, 10:16  [ТС]
Все же вопрос интересный, почему же в блокноте XML документ отображается совершенно иначе чем в браузере, кодировки вроде не влияют,может еще что-то
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
06.11.2014, 13:02
У тебя же было
Цитата Сообщение от Игорь1986 Посмотреть сообщение
Уже решено
, чего опять не так?

Что непонятного? Браузер отображает XML в красивой форме (хоть все в одну строку запиши), если ты открываешь тот же XML в текстовом редакторе - ему эта красивость напрочь не нужна, он отображает файл как есть. Считай это фичей браузера.

Чтобы сохранять XML с красивыми отступами - нужны сторонние библиотеки, стандартные этого не умеют...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.11.2014, 13:06
Да вроде должно нормально форматировать, если не ошибаюсь, там и настройки есть какие-то для отступов.
Что касается обычного блокнота, то там он как бы само по себе отображение страдает.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
06.11.2014, 13:38
Цитата Сообщение от Avazart Посмотреть сообщение
там и настройки есть какие-то для отступов
Не, не форматируется так, как в браузере в любом случае, подглючивает форматирование через doNodeAutoIndent
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.11.2014, 13:45
А мы говорим про FormatXMLData() тот что ты ране советовал мне?
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
06.11.2014, 14:10  [ТС]
Ясно тоесть блокнот он и в африке блокнот спс
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.11.2014, 14:40
Блокнот не инструмент.
Я лично использую Notepad++.
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
06.11.2014, 14:43  [ТС]
Вот в Notepad++ нормально, а простой Блокнот выделывается, самостаятельный
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.11.2014, 15:19
Ну вот я и про то, там кажется с табуляцией проблемы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2014, 15:19
Помогаю со студенческими работами здесь

XML Добавление элемента
Доброго времени суток. Есть шаблон XML-документа с узлом: ... &lt;array&gt; &lt;/array&gt; ... Нужно добавить элементы интового массива в...

Добавление нового элемента в середину .xml
Есть такой хмл &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Root&gt; &lt;Country id=&quot;1&quot; name=&quot;Russia&quot;&gt; &lt;Capital...

Поиск нужного места в XML и добавление в него нового элемента
День добрый! нужна ваша подсказка т.к. сам неделю уже мучаюсь.. есть простенькая XML: &lt;?xml version=&quot;1.0&quot;...

Отрисовка дочернего элемента
Здравствуйте. Зашел в тупик и никак не могу разобраться. Есть компонент представляющий из себя кнопку, которая отрисовывается в сообщении...

Списки. Инициализация, добавление элемента в начало и после другого элемента. Удаление элемента
uses crt; type list= ^item; item=record data: integer; next:list; end; var l:list; procedure print;


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru