Joao da Silva (93)3522-0001 Jose Sousa (93)3522-0002 jose@email.com.br Maria da Silva (93)3522-0003 (93)9122-0001 Raimunda de Sousa rsousa@email.com.br
Em Lazarus/Free Pascal existem três units que dão suporte a XML. São chamadas XMLRead, XMLWrite e DOM. Fazem parte da FCL (Biblioteca de Componentes Livres). Só precisamos adicionar as units na cláusula uses para ter suporte a XML.
DOM (Modelo Objeto de Documento) define uma interface padrão. Quando você escreve código que usa essa interface, você pode mudar para outras implementações de DOM sem precisar mudar seu código fonte.
Lendo XML em um TreeView
Como XML tem uma estrutura de árvore, carregar um documento XML em um TTreeView parece bem natural. No nosso exemplo nós carregamos um documento XML em um DOM e depois mostramos a estrutura em um TTreeView. Para mostrar o documento em uma árvore usamos um método recursivo que navega pelos nós e subnós do XML.
Vamos iniciar uma nova aplicação e na cláusula uses da unit vamos adicionar DOM e XMLRead. No form coloque um TEdit, defina Name como edArquivo e delete o conteúdo de Text. Coloque um botão e defina Name como btnAbrir e Caption como Abrir. Insira mais um botão e em Name informe btnLer e em Caption informe Ler. A propriedade Enabled desse botão deve ficar em False. Agora coloque um TTreeView - da aba Common Controls - e em Name digite tvwXML. Coloque também um TOpenDialog da aba Dialogs e mude Name para dlgAbrir. Sua interface irá ficar assim:
No método do evento OnClick do botão btnAbrir escreva o seguinte código:
if dlgAbrir.Execute then
begin
edArquivo.Text := dlgAbrir.FileName;
btnLer.Enabled := True;
end;
Esse código abre a caixa de diálogo para selecionar o arquivo XML, atribui o nome do arquivo ao TEdit e habilita o botão btnLer. No botão btnLer vamos executar o código que povoa o TTreeView com os dados do documento XML. O método recursivo será construido separado:
procedure TfrmXml.DomToTree(XmlNode: TDOMNode; TreeNode: TTreeNode); var I: integer; NewTreeNode: TTreeNode; NodeText: string; AttrNode: TDOMNode; begin // considera apenas nós elementos if XmlNode.NodeType <> ELEMENT_NODE then Exit; // inclui o nó NodeText := XmlNode.NodeName; if (XmlNode.ChildNodes.Count = 1) and (XmlNode.ChildNodes[0].NodeValue <> '') then NodeText := NodeText + ' = ' + XmlNode.ChildNodes[0].NodeValue; NewTreeNode := tvwXML.Items.AddChild(TreeNode, NodeText); // inclui atributos, se existirem for I := 0 to xmlNode.Attributes.Length - 1 do begin AttrNode := xmlNode.Attributes.Item[I]; tvwXML.Items.AddChild(NewTreeNode, '[' + AttrNode.NodeName + ' = "' + AttrNode.NodeValue + '"]'); end; // inclui cada nó filho if XmlNode.HasChildNodes then for I := 0 to xmlNode.ChildNodes.Count - 1 do DomToTree(xmlNode.ChildNodes.Item[I], NewTreeNode); end;
Este método utiliza várias operações que podemos fazer com DOM. Cada nó tem uma propriedade denominada NodeType, para determinar se é um elemento, atributo, nó texto, etc (linha 09). Nas linhas 13 e 14 podemos observar que NodeValue - a representação textual - só pode ser acessado se o nó tiver um elemento textual. Após mostrar o nome do item e o valor textual - se houver - o método mostra o conteúdo de cada atributo. Em seguida chamamos o método recursivamente para mostrar cada subnó.
A interface do método deve ser informada na seção type. O método do evento OnClick do botão btnLer deve ser assim:
procedure TfrmXml.btnLerClick(Sender: TObject);
var
Documento: TXMLDocument;
begin
tvwXML.Items.Clear;
ReadXMLFile(Documento, edArquivo.Text);
DomToTree(Documento.DocumentElement, nil);
tvwXML.FullExpand;
Documento.Free;
end;
Ele cria um DOM a partir do arquivo XML e depois chama o método que povoa o TTreeView.
Faça o download do código fonte do exemplo aqui.
Atualizado em 08/04/2010.
Nenhum comentário:
Postar um comentário