XML de forma prática no Delphi

Nesse artigo explico como ler um arquivo XML de forma direta, sem OpenDialog com a finalidade de já ter o nome do XML, evitando que o usuário perca tempo em procurar este arquivo em uma pasta lotada de arquivos. usaremos nesse exemplo arquivos INI, com a finalidade de conter o endereço da pasta a qual estão gravados os XMLs. Um exemplo onde poderia ser usado este exemplo seria para leitura de arquivo XML do Danfe, mas o código lê qualquer arquivo XML.

Vamos então ao trabalho: vamos criar um arquivo INI para colocar o endereço de onde ficarão os arquivos XMLs.

Crie uma pasta na raiz do C:\ chamada XMLs e nela crie uma pasta para salvar o sistema.

Agora abra o Bloco de notas e coloque o caminho como abaixo:

[ler_xml]
    path=C:\XMLs\

Salve o arquivo do Bloco de notas como conf.ini , na pasta onde será salvo o sistema.

Crie um novo projeto (File/New/VCL Forms Application – Delphi) e coloque no Formulário um Label , um Edit e um BitBtn , e configure como a Figura 1.

Novo projeto

Figura 1. Novo projeto

Declare IniFiles na sessão Uses e iniConf : TiniFile; na sessão private e Caminho :string; em public como abaixo:

unit UfrmPrincipal;
 interface
  uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, Buttons, IniFiles;
   type
    TFrmLeitorXMLs = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    BtnAbrirXML: TBitBtn;
    private
     { Private declarations }
     iniconf:TIniFile;
    public
     { Public declarations }
    Caminho :string;
end;

No evento OnCreate, coloque o seguinte código:

procedure TFrmLeitorXMLs.FormCreate(Sender: TObject);
  begin
     iniconf := TIniFile.Create(ExtractFilePath(Application.ExeName)+'conf.ini');
end;

Todo o conteúdo do arquivo .INI será armazenado na variável iniconf que é do tipo TIniFile, colocamos um único endereço, mas poderiam ser vários, como caminho de banco de dados, nomes, etc.

Salve o projeto na pasta como uFrmPrincipal com nome do projeto ProjetoXML.

Agora vamos criar um novo formulário para exibir o arquivo XML. Crie um novo projeto (File/New/ Form – Delphi) e salve como UfrmExibeXml.

Coloque nesse novo Form os seguintes componentes: Um TreeView, um XMLDocument, um Memo, um Label e um BitBtn e configure como mostra a Figura 2.

Novo Form

Figura 2. Novo Form

Declare a seguinte Procedure em Private:

private
  { Private declarations }
   procedure GenereteTree(XMLNode: IXMLNode; TreeNode: TTreeNode);  // *****
    public
     { Public declarations }
    end;

Agora vamos implementar uma procedure em Private:

private
 { Private declarations }
  procedure GenereteTree(XMLNode: IXMLNode; TreeNode: TTreeNode);  // *****
  public
   { Public declarations }
  end;

Onde estão os cinco asteriscos( *****), posicione o cursor e execute a junção de teclas Ctrl + Shift + C, com este comando será criado a procedure. Implemente o seguinte código na Procedure:

procedure TFrmExibeXml.GenereteTree(XMLNode: IXMLNode; TreeNode: TTreeNode);
 var
  NodeText : string;
  NewTreeNode: TTreeNode;
  I : Integer;
 begin
  if XMLNode.NodeType <> ntElement then
  Exit;
  NodeText := XMLNode.NodeName;
  if XMLNode.IsTextElement then
   NodeText := NodeText + '=' + XMLNode.NodeValue;
   NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);
   if XMLNode.HasChildNodes then
    for I := 0 to XMLNode.ChildNodes.Count - 1 do
      GenereteTree(XMLNode.ChildNodes[I], NewTreeNode);
    end;

Esta procedure é responsável por montar a estrutura em árvore dentro do TreeView.

Volte aoFrmPrincipale de Uses em UfrmExibeXml e coloque o seguinte código no botão Abrir XML:

procedure TFrmLeitorXMLs.BtnAbrirXMLClick(Sender: TObject);
  begin
    Caminho := iniconf.ReadString('ler_xml','path','')+ Edit1.Text +'.xml';
    try
     Application.CreateForm(TFrmExibeXml, FrmExibeXml);
     FrmExibeXml.ShowModal;
    finally
     FrmExibeXml.Release;
   end;
 end;

Quando o usuário clicar sobre o botão Abrir XML, a variável Caminho irá receber o caminho do arquivo conf.ini + o conteúdo do Edit + a extensão .xml.

Volte ao formulário ExibeXml,de Uses em FrmPrincipal, pois lá está a variável com o caminho + o nome do XML. Em seguida vá ao evento OnShow e coloque o seguinte código:

procedure TFrmExibeXml.FormShow(Sender: TObject);
  begin
    XMLDocument1.LoadFromFile (FrmLeitorXMLs.Caminho); // pegando o conteúdo da variável Caminho.
    TreeView1.Items.Clear; //limpa o conteúdo que estiver na TreeView
    XMLDocument1.Active:= True; // ativa o XMLDocument
    GenereteTree(XMLDocument1.DocumentElement, nil); //Monta a TreeView
    with Memo1.Lines do
     begin
      Clear; //limpa o memo para receber as informações do arquivo XML
      Add('Versão : ' + XMLDocument1.Version);
      Add('Encoding : ' + XMLDocument1.Encoding);
      Add('FileName : ' + XMLDocument1.FileName);
    end;
  end;

E no botão fechar o seguinte código:

procedure TFrmExibeXml.BitBtn1Click(Sender: TObject);
 begin
   Close;
end;

Compile o projeto , digite o nome de um XML e abra. Deve ficar como mostra a Figura 3.

Compilação do projeto

Figura 3. Compilação do projeto

Nesse exemplo tudo está em memória, mas poderia estar em um banco de dados. Para isso, o que teria que fazer seria concatenar o arquivo endereço do INI com o ClientDataSet, + - assim:

Caminho := DM_1.iniconf2.ReadString('ler_xml','path','')+ DM_1.CDSNotaDespEND_DANFE.Value +'.xml';

Até a próxima

Links Úteis

  • Oracle e Delphi
    Veja neste artigo de Fabio e Fernando Prass, como utilizar o Oracle (umdos melhores BD do mundo) com Delphi.
  • DevCast: Um bate-papo sobre o Delphi:
    O Delphi está em constante evolução e com ele podemos criar aplicações desktop, servidores de aplicações, aplicativos móveis, entre outros. Neste DevCast temos um bate-papo sobre essa poderosa ferramenta de desenvolvimento.
  • Todos os Cursos de Delphi
    Confira os cursos que a DevMedia preparou para você se tornar um programador Delphi completo. Aprenda a desenvolver aplicações desktop, web e mobile utilizando o VCL, FireMonkey, FireDac e mais.

Saiba mais sobre Delphi ;)