Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.70/37: Рейтинг темы: голосов - 37, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
1

Работа с XML в Builder

07.06.2021, 14:29. Показов 7403. Ответов 31
Метки нет (Все метки)

Здравствуйте, Товарищи! Очень нужна помощь профессионала...
Есть вопрос такого плана...
Есть прога, которая на сервере берет xml. Есть код на замену xml.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//---------------------------------------------------------------------------
#pragma hdrstop
#include "XmlReplace.h"
//---------------------------------------------------------------------------
char* XmlReplaceMemory(char* xml)
  {
  char* out_xml=NULL;
  int   i, j, n;
  bool  waitend;
 
  if ((xml!=NULL) && (strlen(xml)>0))
    {
    n=strlen(xml);
    out_xml=new char[n+1];
    i=0;
    j=0;
    waitend=false;
    while(i<n)
      {
      if ((i<n-1) &&  (xml[i]=='&') && (xml[i+1]=='#')) waitend=true;
      if (!waitend) { out_xml[j]=xml[i]; j++; }
        else { if (xml[i]==';') waitend=false; }
      i++;
      }
    out_xml[j]=0;
    }
  return out_xml;
  }
//---------------------------------------------------------------------------
bool  XmlReplaceFile(wchar_t* xmlfile)
  {
  bool   result=false;
  HANDLE FileHandle;
  DWORD  FileSize, Bytes;
  BYTE*  FileBody=NULL;
  BYTE*  FileBodyOut=NULL;
 
  FileHandle=CreateFile(xmlfile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  if (FileHandle!=INVALID_HANDLE_VALUE)
    {
    FileSize=GetFileSize(FileHandle,NULL);
    if (FileSize>0)
      {
      FileBody=new BYTE[FileSize+1];
      ReadFile(FileHandle,FileBody,FileSize,&FileSize,NULL);
      FileBody[FileSize]=0;
      }
    CloseHandle(FileHandle);
    }
 
  if (FileBody!=NULL)
    {
    FileBodyOut=XmlReplaceMemory(FileBody);
    delete FileBody; FileBody=NULL;
    }
  if (FileBodyOut!=NULL)
    {
    FileHandle=CreateFile(xmlfile,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
    if (FileHandle!=INVALID_HANDLE_VALUE)
      {
      WriteFile(FileHandle,FileBodyOut,strlen(FileBodyOut),&Bytes,NULL);
      CloseHandle(FileHandle);
      result=true;
      }
    delete FileBodyOut; FileBodyOut=NULL;
    }
  return result;
  }
//---------------------------------------------------------------------------
#pragma package(smart_init)
Нужен код на объединение таких же xml и исключения повторений в них.
Пример xml у меня есть.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2021, 14:29
Ответы с готовыми решениями:

Работа с XML файлами в Builder С++
Добрый день, уважаемые форумчане! Подскажите какие-нибудь учебники по работе с XML файлами в...

C++ Builder и XML
Кто работал, поделитесь где инфу можно почитать по работе билдера с xml

XML в c++ builder 6
нужно создавать, изменять и читать данные с XML-файла, а литературу никак найти не могу.. может кто...

XML в С++ Builder - загрузка из БД
Здравствуйте, извините заранее за возможно длинный и наглый вопрос, но у меня уже нет сил и я не...

31
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
07.06.2021, 15:48 2
Цитата Сообщение от Zidane Посмотреть сообщение
Есть код на замену xml
Честно говоря - совсем непонятный код! Что на что меняете? Цель программы озвучьте точно. И хорошо бы пример файла получить с пояснениями, что, на что и в каком случае менять.
Цитата Сообщение от Zidane Посмотреть сообщение
Нужен код на объединение таких же xml и исключения повторений в них.
тоже не худо бы на примере объяснить...
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
07.06.2021, 16:14  [ТС] 3
Файл xml
Смысл проги в том, чтобы оповещать работника о таких сообщениях (из них состоит xml).
Но работает она так... Обращается к серверу за одной xml. Затем по истечению времени или по запросу происходит обновление. Соответственно, загружается новая xml, которая меняет старую.
Нужно, чтобы не меняла, а объединялаcь с той, что была до неё, и исключала повторения сообщений, из которых и состоит эта xml...
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
07.06.2021, 16:20  [ТС] 4
Цитата Сообщение от D1973 Посмотреть сообщение
И хорошо бы пример файла получить с пояснениями, что, на что и в каком случае менять.
Принцип работы примерно объяснил.

01.zip
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
07.06.2021, 16:22  [ТС] 5
Цитата Сообщение от D1973 Посмотреть сообщение
Что на что меняете?
Одна xml меняет другую.
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
08.06.2021, 16:40  [ТС] 6
Код нужен для объединения двух таких xml и исключения повторений в уже объединённой...
Пожалуйста... )
0
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
09.06.2021, 07:00 7
ну, распарсить этот xml - проблем вообще не представляет. На основании него можно сделать определенный шедулер, который будет выводить сообщения во время, указанное в поле "ZTimeBgn". После сработки запись или удаляется из шедулера, или, что лучше, просто помечается, как "исполненная" и в дальнейшем не учитывается. Это просто.
А вот по поводу объединения... Тут не совсем понятно. Сравнивать строки одна с другой - это не вариант вообще: достаточно запятую пропустить или лишнюю поставить - и все, строки являются несовпадающими. Вот в каждой записи есть поле "UN" - оно, как бы, больше всего подходит под определение уникального идентификатора, но так ли это на самом деле? Можете предоставить оба файла для объединения, в которых будут пересечения данных, чтобы проанализировать этот момент?

Добавлено через 1 минуту
Ну, и, кстати, уточните свою версию билдера.
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
09.06.2021, 09:50  [ТС] 8
Builder XE7

Цитата Сообщение от D1973 Посмотреть сообщение
есть поле "UN" - оно, как бы, больше всего подходит под определение уникального идентификатора
Это на самом деле так...

В общем, грубо говоря, момент такой. Предположим, что программа скачала xml того вида, что я сбросил. Если на программе нажать обновить, то скачается такая же xml, только в ней может быть + одна или несколько новых <data></data>, но она перекроет старую. Вот, и задача состоит в том, чтобы новоскаченная xml не перекрывала старую, а объединялась с ней, и после объединения исключить повторяющиеся <data></data> с одинаковым UN.

Вот.

Добавлено через 1 минуту
Цитата Сообщение от D1973 Посмотреть сообщение
На основании него можно сделать определенный шедулер, который будет выводить сообщения во время, указанное в поле "ZTimeBgn". После сработки запись или удаляется из шедулера, или, что лучше, просто помечается, как "исполненная" и в дальнейшем не учитывается. Это просто.
Если можно, подробнее расскажите, пожалуйста... Или пример приведите какой-нибудь )
0
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
09.06.2021, 14:37 9
Цитата Сообщение от Zidane Посмотреть сообщение
Или пример приведите какой-нибудь
Да, завтра на работе набросаю, дома билдера нет сейчас...
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
09.06.2021, 14:48  [ТС] 10
Спасибо большое )
Надеюсь, что с и объединением xml получится...
Объяснил вроде качественно )
0
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
09.06.2021, 16:31 11
Цитата Сообщение от Zidane Посмотреть сообщение
Объяснил вроде качественно
Да, объяснили понятно, только, таки, хотелось бы оба файла увидеть, чтобы свои не сочинять...
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
09.06.2021, 16:51  [ТС] 12
Блин... Если честно, то второго у меня и нет.
Но... Там новый файл будет идентичный старому. Почти... Отличаться они будут несильно.
В новом (который скачивается после) просто будут новые записи <data></data>, и возможно не будет некоторых <data></data>, которые есть в первом.
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
09.06.2021, 16:54  [ТС] 13
Ну вот...
Между 11 и 12 разница два дня примерно... Но там тоже есть совпадения
Между 12 и 13 буквально минут 10.
1113.zip
0
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
10.06.2021, 15:24 14
Zidane, ну вот посмотрите, что примерно получается. Программа читает указанные XML-файлы и подгружает их в свою локальную БД, при загрузке откидывая те записи, UN которых уже присутствует в базе и те, у которых просрочено время оповещения. После загрузки включается таймер и по достижении времени для очередного оповещения оно появляется на экране и, если его после просмотра корректно закрыли - помечается в базе как исполненное... Выглядит это примерно вот так:

Работа с XML в Builder


Если устраивает - исходник вместе с пустой базой и тестовыми файлами скину чуть позже - сейчас тестирование идет.
В тестовых файлах Вам надо будет изменить дату/время, а то не загрузятся
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
10.06.2021, 15:52  [ТС] 15
Спасибо большое!!!
Сбрасывайте, конечно...
Возможно, что в коде не сразу сам смогу разобраться, но в целом выглядит всё вполне здорово )
0
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
10.06.2021, 15:58 16
Цитата Сообщение от Zidane Посмотреть сообщение
выглядит всё вполне здорово
Не совсем... Тестирование показало косяк в алгоритме, когда окно сообщения начинает выскакивать каждый тик таймера (а это 0,5 минуты), если его сразу не закрыть корректно (на кнопку "Принято!"). Как исправить - примерно понятно, но это только завтра...
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
10.06.2021, 16:06  [ТС] 17
А можете пока код сбросить, где идёт обработка xml?
Хотя бы понемногу буду разбираться...

Добавлено через 34 секунды
Или же Вы всё сделали одним процессом?

Добавлено через 51 секунду
Кстати, насчёт таймера вполне себе неплохая задумка...
Мне и в голову оповещение не приходило )
0
Модератор
7007 / 4549 / 1927
Регистрация: 21.01.2014
Сообщений: 19,325
Записей в блоге: 3
10.06.2021, 16:22 18
Лучший ответ Сообщение было отмечено Zidane как решение

Решение

Вот посмотрите... Чуть поправил, но перекомпилировать и проверить сейчас негде, только завтра...
1
Вложения
Тип файла: rar Builder_XE6.rar (14.3 Кб, 5 просмотров)
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
10.06.2021, 16:23  [ТС] 19
Спасибо огромное...
Ждём завтра )
0
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 20
14.06.2021, 08:57  [ТС] 20
Если можно, расскажите, какую функцию выполняет каждый раздел в Unit1.cpp.
Так разобраться в коде будет легче...
Можно и в ЛС

Добавлено через 8 минут
Кратко, в 2-3 словах...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2021, 08:57

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как создать xml файл? (C++ Builder 10)
Есть файл с данными, которые нужно структурировать и сохранить в xml файле. как прочитать данные и...

Работа с XML через System.Xml
День добрый! Подскажите пожалуйста как решить такую проблему. Есть XML документ следующего...

Работа с xml. Вывод данных в xml
Добрый день! Нужно на выходе консольного приложения (после его закрытия) получить xml файл в виде...

Работа с картинками в builder
Столкнулся с проблемой осчезновения картинки. Пишу код программы где необходим при правильном...

Работа со временем Builder C++ 5
Друзья, подскажите как работать со временем в пятом билдере AnsiString T1 =...

Работа с точками в C++ Builder
Canvas-&gt;Pixels = clBlue; как сделать так, что б её диаметр увеличелся???


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

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

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