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.
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.
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.
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 ;)
- Princípios SOLID com Delphi:
Conheça nesse artigo os fundamentos de toda boa prática em desenvolvimento orientado a objetos, saiba como melhorar sua codificação ao entender e utilizar os princípios SOLID. - Performance no SQL Server: eliminando o operador Sort:
Nesse pocket video veremos como o Delphi trabalha na orientação a objetos com os conceitos de projeto, units e escopo. - TransactionDesc: Delphi:
Veja nesta quick como podemos trabalhar com transações no Delphi usando a classe TTransactionDesc.