C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
XML и Данные с форм, Как осуществить запись и чтение XML
Make
Отправлено: 20.12.2006, 09:39


Ученик-кочегар

Группа: Участник
Сообщений: 13



К примеру имется форма на которой расположены компонеты Edit и ListBox, а также несколько кнопок на открытие дочерних форм (пусть на 2 формы) с темеже или другими компонетами как мне записать данные из всех компонет всех форм в XML фаил а потом при создании форм загружать все ето обрадно

Отредактировано Make — 20.12.2006, 09:40
olegenty
Отправлено: 20.12.2006, 10:00


Ветеран

Группа: Модератор
Сообщений: 2412



вопрос риторический (содержит в себе ответ).

сформировать XML — вообще ничего не нужно. прикидываешь устраивающий тебя состав узлов (Nodes) и формируешь его (хотя парсером всё же удобнее на порядок).

прочитать — тоже не сложно. есть варианты. например, воспользоваться TXMLDocument. но это достаточно тормозной и неудобный парсер. где-то встречал статейку с тестом различных (5 штук) XML парсеров — там выйграл TjanXMLParser2. он бесплатен, качнуть можно на torry.net. сам пользуюсь именно им.
Make
Отправлено: 21.12.2006, 09:14


Ученик-кочегар

Группа: Участник
Сообщений: 13



если чесно ничего не понял, можно пожалуйст попроще тоже самое описать, я ведь еще мал и глуп сленгом не владею, ума тоже не нажил.. rolleyes.gif
olegenty
Отправлено: 21.12.2006, 10:29


Ветеран

Группа: Модератор
Сообщений: 2412



Ну, вот вырезка на чтение (использую TjanXMLParser2):
CODE

///////////////////////////////////////////////////////////////////////////////////////////////////
PResTable __fastcall CServerOperator::SelectServersFromXml(const AnsiString FileName)
{
   PResTable Result(new CResTable(false));

   SmartIniType Xml(new IniType()); // SmartIniType — это auto_ptr<TjanXMLParser2>, IniType — это TjanXMLParser2
   Xml->LoadXML(FileName);
   TjanXMLNode2 *Servers = Xml->getChildByName("ServerList");
   if (Servers)
   {
       TjanXMLNodeList2 *ServerList = Servers->nodes;
       if (ServerList)
       {
           try
           {
               for (int ServerIndex = 0; ServerIndex < ServerList->Count; ServerIndex++)
               {
                   TjanXMLNode2 *Item = (TjanXMLNode2*)(ServerList->Items[ServerIndex]);
                   if (Item)
                   {
                       CFields Server;
                       Server.Add("Name"            , Item->name);
                       Server.Add("Address"         , Item->attribute["Address"]);
                       Server.Add("User"            , Item->attribute["User"   ]);
                       Server.Add("Password"        , Item->attribute["Password"]);
                       Server.Add("HostDirName"     , Item->attribute["HostDirName"]);
                       Server.Add("HostVerFileName" , Item->attribute["HostVerFileName"]);
                       Server.Add("HostListFileName", Item->attribute["HostListFileName"]);
                       Server.Add("UpdateInfoDir"   , Item->attribute["UpdateInfoDir"]);
                       Result->Append(Server);
                   }
               }
               Result->Executed() = true;
           } catch(...)
           {
           }
       }
   }
   return Result;
}

а вот на запись:
CODE

///////////////////////////////////////////////////////////////////////////////////////////////////
void __fastcall CServerOperator::SaveServers2Xml(const AnsiString FileName)
{
   PVirtualNode  Node  ;
   RecordType   *Record = NULL;
   AnsiString BackupFileName = ChangeFileExt(FileName, ".bak");
   CopyFile(FileName.c_str(), BackupFileName.c_str(), false);
   SmartIniType Xml = SmartIniType(new IniType());
   Xml->LoadXML(FileName);
   TjanXMLNode2 *Servers = Xml->getChildByName("ServerList");
   if (Servers) Servers->parentNode->deleteNode(Servers);
   Servers = Xml->addChildByName("ServerList");
   if (!Servers) return;

   for (unsigned int i = 0; i < Tree_->RootNodeCount; i++)
   {
       if (!i)
       {
           Node = Tree_->RootNode->FirstChild;
       } else
       {
           Node = Node->NextSibling;
       }
       Record = (RecordType*)Tree_->GetNodeData(Node);
       if (Record)
       {
           TjanXMLNode2 *Server = Servers->addChildByName(Record->ServerName);
           if (Server)
           {
               CFields Attributes = Servers_[Record->ServerName];

               Server->attribute["Address"]          = Attributes["Address"];
               Server->attribute["User"]             = Attributes["User"];
               Server->attribute["Password"]         = Attributes["Password"];
               Server->attribute["HostDirName"]      = Attributes["HostDirName"];
               Server->attribute["HostVerFileName"]  = Attributes["HostVerFileName"];
               Server->attribute["HostListFileName"] = Attributes["HostListFileName"];
               Server->attribute["UpdateInfoDir"]    = Attributes["UpdateInfoDir"];
           }
       }
   }
   Xml->SaveXML(FileName);
}

Вернуться в Вопросы программирования в C++Builder