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

Запись в xml из StringGrid

30.09.2014, 17:21. Показов 1845. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто подскажет по поводу записи в xml из StringGrid,
в StringGrid есть столбец тип, который может быть определенным числом, если это число 9 то это дочерний от корневого элемент в xml, пока не встретится следующий тип 9, необходимо все последующие строки, сделать вложенными от этого дочернего элемента тоесть типа
XML
1
2
3
4
5
<Protect Type="9" Name="" >
    <Parameters Type="2" CountParam="1" Name="" Razm=""  Byte_Before="0" Byte_After="0"  /> 
   <Parameters Type="2" CountParam="2" Name="З" Razm=""  Byte_Before="6" Byte_After="0" Addr="1004"  /> 
   <Parameters Type="2" CountParam="3" Name="" Razm=""   /> 
    </Protect>
код конечно составлен неверно, но приведу
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
34
_di_IXMLDocument  XMLDocument= NewXMLDocument();
 IXMLNode *nodParameters, *nodDefence, *node;
  try
  {
    XMLDocument->Active = True;
    XMLDocument->Encoding = "UTF-16";
    XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent;
 
    _di_IXMLNode nodElement = XMLDocument->CreateElement("Diamant", "");
    XMLDocument->ChildNodes->Add(nodElement);
    node = nodElement->AddChild("UstavkiExpl");
    for (int i = 0; i < Result->RowCount-1; i++)
    {
     if(Result->Cells[2][i+1]=="9")
     {
       nodDefence = node->AddChild("Defence");
       
       AnsiString Name=Result->Cells[0][i+1];
       nodDefence->SetAttribute("Name", Name);
       AnsiString Ed_Izm=Result->Cells[1][i+1];
     }
     else
     {
       ///вот здесь надо сделать вложенный тег
      
     }
 
    }
    XMLDocument->SaveToFile(FileName);
    XMLDocument->Active = false;
  }
  catch(Exception& e){
  }   
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2014, 17:21
Ответы с готовыми решениями:

Запись XML-дерева сразу в xml-файл (парсер JAXP)
Народ!Программеры!Помогите человеку,плиз! Парсерю я xml-файл,через DOM-модель,использую JAXP.После модификации надо все дерево записать в...

StringGrid - загрузка из и сохранение в XML файл
вы говорили что можете помоч с сохранением и загрузкой в XML файл ,,, ну очень нужно завтро прогу сдавать (по нажатию на кнопку...

Запись XML. Запись кавычек
Доброго времени суток. Помогите решить такую проблемку:XML = Новый ЗаписьXML; XML.УстановитьСтроку(&quot;windows-1251&quot;); ...

13
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
30.09.2014, 18:23
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
34
    _di_IXMLDocument XMLDocument = NewXMLDocument();
    IXMLNode *nodParameters, *nodDefence, *node;
    bool inner = false;
    try
    {
        XMLDocument->Active = true;
        XMLDocument->Encoding = "UTF-16";
        XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent;
 
        _di_IXMLNode nodElement = XMLDocument->CreateElement("Diamant", "");
        XMLDocument->ChildNodes->Add(nodElement);
        node = nodElement->AddChild("UstavkiExpl");
        for (int i = 0; i < Result->RowCount - 1; i++)
        {
            if (Result->Cells[2][i + 1] == "9")
            {
                if (!inner)
                    node = node->AddChild("SubNode");
                else
                    node = node->ParentNode;
                inner = !inner;
            }
            nodDefence = node->AddChild("Defence");
 
            AnsiString Name = Result->Cells[0][i + 1];
            nodDefence->SetAttribute("Name", Name);
            AnsiString Ed_Izm = Result->Cells[1][i + 1];
        }
        XMLDocument->SaveToFile(FileName);
        XMLDocument->Active = false;
    }
    catch (Exception& e)
    {
    }
Что-то такого типа нужно?
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
30.09.2014, 21:15
А какие инструменты C++Builder или WinAPI наиболее удачны для парсинга и синтеза xml?
А то же самое для HTML и XHTML?
Благодарю.
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 10:06  [ТС]
Возможно и такое. сейчас не проверю,завтра отпишусь

Добавлено через 11 часов 34 минуты
Не совсем так, получается что они идут
XML
1
2
3
4
5
6
7
<Diamant>
<UstavkiExpl>
<SubNode>
<Defence Name="ОЗЗ - 1 СТУПЕНЬ" Dim="" Type="9"/>
<Defence Name="ЗАЩИТА РАБОТАЕТ НА" Dim="" Type="1"/>
<Defence Name="НАПРЯЖЕНИЕ СРАБАТЫВАНИЯ" Dim="В" Type="3"/>
<Defence Name="УСТ. НУЛЯ ФАЗН. НАПРЯЖ." Dim="В" Type="3"/>
а надо немного по другому тоесть
XML
1
2
3
4
5
<Diamant>
<UstavkiExpl>
<SubNode Name="ОЗЗ - 1 СТУПЕНЬ" Dim="" Type="9"/>
<Defence Name="ЗАЩИТА РАБОТАЕТ НА" Dim="" Type="1"/>
<Defence Name="НАПРЯЖЕНИЕ СРАБАТЫВАНИЯ" Dim="В" Type="3"/>
тоесть в SubNode записывать Type="9" как заголовок, а далее вложенный тег по его всем параметрам пока не встретится новый заголовок с типом 9

Добавлено через 9 минут
Причем надо еще учитывать когда новый заголовок то опять делать такую конструкцию

XML
1
2
3
<SubNode Name="ОЗЗ - 1 СТУПЕНЬ" Dim="" Type="9"/>
<Defence Name="ЗАЩИТА РАБОТАЕТ НА" Dim="" Type="1"/>
<Defence Name="НАПРЯЖЕНИЕ СРАБАТЫВАНИЯ" Dim="В" Type="3"/>
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
01.10.2014, 10:12
Ты не показал, что надо делать со второй девяткой, просто закрыть тег Subnode, или что?

Вот так создастся то, что ты показал:
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
34
35
36
37
38
39
40
41
42
43
    _di_IXMLDocument XMLDocument = NewXMLDocument();
    IXMLNode *nodParameters, *nodDefence = 0, *node;
    bool inner = false;
    try
    {
        XMLDocument->Active = true;
        XMLDocument->Encoding = "UTF-16";
        XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent;
 
        _di_IXMLNode nodElement = XMLDocument->CreateElement("Diamant", "");
        XMLDocument->ChildNodes->Add(nodElement);
        node = nodElement->AddChild("UstavkiExpl");
        for (int i = 0; i < Result->RowCount - 1; i++)
        {
            if (Result->Cells[2][i + 1] == "9")
            {
                if (!inner)
                {
                    node = node->AddChild("SubNode");
                    AnsiString Name = Result->Cells[0][i + 1];
                    node->SetAttribute("Name", Name); // тут добавишь остальные атрибуты
                    inner = true;
                    continue; // Это - чтобы уйти на следующий виток, потом начнут создаваться подайтемы
                }
                else
                {
                    node = node->ParentNode;
                    inner = false;
                    // continue; // если не надо закрывающую "9"-ку выносить во внешний тег...
                }
            }
            nodDefence = node->AddChild("Defence");
 
            AnsiString Name = Result->Cells[0][i + 1];
            nodDefence->SetAttribute("Name", Name);
            AnsiString Ed_Izm = Result->Cells[1][i + 1];
        }
        XMLDocument->SaveToFile(FileName);
        XMLDocument->Active = false;
    }
    catch (Exception& e)
    {
    }
Ну, понятно, что если и там и там нужны continue, то лучше вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            if (Result->Cells[2][i + 1] == "9")
            {
                if (!inner)
                {
                    node = node->AddChild("SubNode");
                    AnsiString Name = Result->Cells[0][i + 1];
                    node->SetAttribute("Name", Name); // тут добавишь остальные атрибуты
                }
                else
                    node = node->ParentNode;
 
                inner = !inner;
                continue;
            }
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 10:14  [ТС]
Да закрыть тег для Subnode, и далее когда следующая 9 новый Subnode с такой же конструкцией
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
01.10.2014, 10:19
Цитата Сообщение от Игорь1986 Посмотреть сообщение
Причем надо еще учитывать
Блин. Ты можешь окончательный пример XML-я привкести в нормальном виде, или нет? Что из тебя все надо клещами вытаскивать? Покажи:
второй столбец = <1, 2, 3, 9, 2, 3, 4, 9, 5, 6, 7, 9, 10>... Что должно быть в XML-е? Полностью!!! Без пространных объеснений словами. Просто XML...
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 10:20  [ТС]
ОСТАЛСЯ ПОСЛЕДНИЙ ВОПРОСИК ТЕПЕРЬ НАДО СДЕЛАТЬ
<SubNode Name="ОЗЗ - 1 СТУПЕНЬ" Dim="" Type="9"/>
<Defence Name="ЗАЩИТА РАБОТАЕТ НА" Dim="" Type="1"/>
<Defence Name="НАПРЯЖЕНИЕ СРАБАТЫВАНИЯ" Dim="В" Type="3"/>
</SubNode>
И ДАЛЕЕ УЖЕ ДРУГОЙ ЗАГОЛОВОК С ТИПОМ 9
<SubNode Name="ОЗЗ - 1 СТУПЕНЬ" Dim="" Type="9"/>
<Defence Name="ЗАЩИТА РАБОТАЕТ НА" Dim="" Type="1"/>
<Defence Name="НАПРЯЖЕНИЕ СРАБАТЫВАНИЯ" Dim="В" Type="3"/>
</SubNode>
ВОТ КАК ТО ТАКАЯ КОНСТРУКЦИЯ
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 10:24  [ТС]
Вот после закрытия 1 узла </SubNode> идет сразу тег <Parameters а надо следующий тег SubNode
он есть но не везде вот это непонятка
тоесть между Name="ОЗЗ - 1 СТУПЕНЬ" и Name="ОЗЗ - 3 СТУПЕНЬ" должна быть Name="ОЗЗ - 2 СТУПЕНЬ" а там выводит только ее параметры, а заголовка нет
Миниатюры
Запись в xml из StringGrid  
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 10:36  [ТС]
Вот как хочу чтоб было
Миниатюры
Запись в xml из StringGrid  
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 11:13  [ТС]
Вернее вот так там ошибочка,а выше картинка с сообщением в 11:24 как получилось
Миниатюры
Запись в xml из StringGrid  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
01.10.2014, 11:39
Лучший ответ Сообщение было отмечено Игорь1986 как решение

Решение

Вот такой код:
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
34
35
36
37
38
39
40
    _di_IXMLDocument XMLDocument = NewXMLDocument();
    IXMLNode *nodParameters, *nodDefence = 0, *node;
    bool inner = false;
    try
    {
        XMLDocument->Active = true;
        XMLDocument->Encoding = "UTF-16";
        XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent;
 
        _di_IXMLNode nodElement = XMLDocument->CreateElement("Diamant", "");
        XMLDocument->ChildNodes->Add(nodElement);
        node = nodElement->AddChild("UstavkiExpl");
        for (int i = 0; i < Result->RowCount - 1; i++)
        {
            if (Result->Cells[2][i + 1] == "9")
            {
                if(inner) node = node->ParentNode;
 
                node = node->AddChild("SubNode");
                inner = true;
                AnsiString Name = Result->Cells[0][i + 1];
                node->SetAttribute("Name", Name);
                Name = Result->Cells[1][i + 1];
                node->SetAttribute("Type", Name);
                continue;
            }
 
            nodDefence = node->AddChild("Parameters");
            AnsiString Name = Result->Cells[0][i + 1];
            nodDefence->SetAttribute("Name", Name);
            Name = Result->Cells[1][i + 1];
            nodDefence->SetAttribute("Type", Name);
            AnsiString Ed_Izm = Result->Cells[1][i + 1];
        }
        XMLDocument->SaveToFile(FileName);
        XMLDocument->Active = false;
    }
    catch (Exception& e)
    {
    }
Вот по такой таблице:


создает вот такой XML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-16"?>
<Diamant>
  <UstavkiExpl>
    <Parameters Name="name1" Type="1"/>
    <Parameters Name="name2" Type="2"/>
    <SubNode Name="name3" Type="9">
      <Parameters Name="name4" Type="4"/>
      <Parameters Name="name5" Type="5"/>
      <Parameters Name="name6" Type="6"/>
    </SubNode>
    <SubNode Name="name7" Type="9">
      <Parameters Name="name8" Type="8"/>
      <Parameters Name="name9" Type="10"/>
    </SubNode>
  </UstavkiExpl>
</Diamant>
Что теперь не так?
1
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
01.10.2014, 12:00  [ТС]
Спасибо, все замечательно))

Добавлено через 11 минут
Пока вы еще здесь поясните один момент if(inner) node = node->ParentNode; изначально то inner false и получается что условие не пройдет а пойдет далее node = node->AddChild("SubNode"); inner = true;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
01.10.2014, 13:58
Да. Если убрать то условие с inner, то как только встретится 9-ка, произойдет переход на уровень выше. В первый раз это недопустимо, потому что UstavkiExpl будет закрыт, и все последующее будет не вложенным в него, а на одном уровне с ним... Поэтому первый раз возвращаться к родителю не нужно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2014, 13:58
Помогаю со студенческими работами здесь

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

запись в stringgrid
доброе время суток. Прошу помощи, сам не могу додуматься(( у меня из стриггрида1 идет запись в текстовой файл в след. виде (пример): ...

Запись в StringGrid
Добрый день! У меня есть основная таблица, НЕ связанная с файлом. Я вызываю другую форму для редактирования выделенной записи кнопкой: ...

Запись в stringgrid
Помогите с задачей. Есть файл primer1.txt c таким содержимым 35000 5.23 6 При нажатии на кнопку считывается из файла 3 числа: сумма...

Запись в stringgrid
том что колличество и расположение строк определяестя поиском.вот часть кода void __fastcall TForm1::Button1Click(TObject *Sender) { ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru