Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Загрузка XML в Delphi без предварительного определения полей

Delphi , Интернет и Сети , XML

При работе с XML-файлами в Delphi часто возникает необходимость загрузить данные в TClientDataSet или другой компонент, работающий с данными, без предварительного определения полей. В такой ситуации можно использовать динамическое создание полей на основе структуры XML. Ниже приведен пошаговый процесс решения данной задачи.

Подготовка компонентов

Для начала необходимо подготовить компоненты, которые будут использоваться для работы с XML. В частности, необходимо создать экземпляр IXMLDOMDocument и загрузить в него XML-данные.

procedure TForm1.FormCreate(Sender: TObject);
begin
  XmlDoc := CoDOMDocument.Create;
  XmlDoc.Async := False;
  XmlDoc.LoadXML('<DOCTO id="3892" usuario="2" data="22/12/2015 10:33:22"><CONDUTA_1>teste conduta 1</CONDUTA_1><CONDUTA_2>teste conduta 2</CONDUTA_2></DOCTO>');
end;

Загрузка данных из атрибутов

Если поля должны быть созданы на основе атрибутов корневого элемента, то можно использовать следующий подход:

procedure TForm1.LoadFromAttributes;
var
  PathQuery : String;
  NodeList : IXmlDOMNodeList;
  Node,
  AttrNode : IXmlDomNode;
  Attributes : IXMLDOMNamedNodeMap;
  Field : TField;
  i : Integer;
begin
  PrepareCDS;

  PathQuery := 'DOCTO';
  NodeList := XmlDoc.SelectNodes(PathQuery);
  Assert(NodeList.Length > 0);
  Node := NodeList.item[0];
  Attributes := Node.attributes;
  for i := 0 to Attributes.Length - 1 do begin
    AttrNode := Attributes.item[i];
    Field := TStringField.Create(Self);
    Field.Size := 80;
    Field.FieldName := AttrNode.nodeName;
    Field.DataSet := CDS1;
    CDS1.FieldDefs.Add(Field);
  end;

  CDS1.CreateDataSet;

  CDS1.Insert;
  for i := 0 to Attributes.Length - 1 do begin
    AttrNode := Attributes.item[i];
    CDS1.Fields[i].Value := AttrNode.nodeValue;
  end;
  CDS1.Post;
end;

Загрузка данных из элементов

Если поля должны быть созданы на основе элементов, то есть подэлементов корневого элемента, используется следующий алгоритм:

procedure TForm1.LoadFromNodes;
var
  PathQuery : String;
  NodeList : IXmlDOMNodeList;
  Node : IXmlDomNode;
  Field : TField;
  i : Integer;
begin
  PrepareCDS;

  PathQuery := 'DOCTO/*';
  NodeList := XmlDoc.SelectNodes(PathQuery);
  Assert(NodeList.Length > 0);
  for i := 0 to NodeList.Length - 1 do begin
    Node := NodeList.item[i];
    Field := TStringField.Create(Self);
    Field.Size := 80;
    Field.FieldName := Node.nodeName;
    Field.DataSet := CDS1;
    CDS1.FieldDefs.Add(Field);
  end;

  CDS1.CreateDataSet;

  CDS1.Insert;
  for i := 0 to NodeList.Length - 1 do begin
    Node := NodeList.item[i];
    CDS1.Fields[i].Value := Node.Text;
  end;
  CDS1.Post;
end;

Подготовка TClientDataSet

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

procedure TForm1.PrepareCDS;
begin
  if CDS1.Active then
    CDS1.Close;
  CDS1.FieldDefs.Clear;
  CDS1.Fields.Clear;
end;

Пример использования

В форме создаются кнопки для вызова процедур загрузки данных. При клике на кнопку соответствующая процедура выполняет загрузку данных в TClientDataSet.

procedure TForm1.btnAttributesClick(Sender: TObject);
begin
  LoadFromAttributes;
end;

procedure TForm1.btnFromNodesClick(Sender: TObject);
begin
  LoadFromNodes;
end;

Заключение

Приведенные примеры кода позволяют загрузить данные из XML в TClientDataSet без предварительного определения полей, что особенно удобно в случае динамически изменяющейся структуры XML. Важно помнить, что в реальных приложениях структура XML может быть более сложной, и в таком случае может потребоваться более глубокий анализ и адаптация кода под конкретные условия.

Этот подход может быть использован в качестве основы для создания более сложных решений, например, с использованием обработчиков событий XML или других компонентов Delphi, предназначенных для работы с XML данными.

Создано по материалам из источника по ссылке.

Загрузка XML-данных в `TClientDataSet` в Delphi без предварительного определения структуры полей, используя динамическое создание полей на основе анализа XML.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: XML ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 12:44:14/0.011641979217529/0