ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Ler XML e adicionar na TreeView [RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
jedi_pereira
Novato
Novato


Registrado: Segunda-Feira, 27 de Abril de 2009
Mensagens: 12

MensagemEnviada: Qua Mai 06, 2009 11:28 am    Assunto: Ler XML e adicionar na TreeView [RESOLVIDO] Responder com Citação

ola a todos,

primeiramente, eu consegui ler um XML e criar toda uma treeview.

o que quero agora é dada um treeview parcialmente preenchida, ler arquivos XML e coloca-los como nós na treeview. Cada XML será um nó.

exemplo:
na treeview tem os nós X e Y (irmãos entre si). X e Y são tipos de <categoria> no XML.

quero ler o valor de <categoria> no XML e de acordo com o valor (X ou Y) inserir o XML no seu respectivo lugar na treeview.

eu abro o XML assim e essa parte funciona:
//------------------Abre arquivos XML na pasta--------------------
procedure TfrmLocaisDispositivos.AbreXML(dir: string);
var
SearchRec : TSearchRec;
Separator : string;
FileHandle: string;
Begin
if Copy(Dir,Length(Dir),1)='\' then
begin
Separator := '';
end
else
begin
Separator := '\';
end;

//procura o primeiro arquivo da pasta indicada em Dir que seja da extensão
//XML e grava o resultado da busca em SearchRec
if FindFirst(Dir + Separator + '*.xml', faAnyFile, SearchRec) = 0 then
begin
//se o arquivo existe
if FileExists(Dir + Separator + SearchRec.Name) then
begin
FileHandle := SearchRec.Name; //Identificador do arquivo
//criar estrutura para armazenar os dados
xmldcmntDispGeral.FileName := FileHandle;
AdicionaXMLArvore(tvDispositivosDesign,xmldcmntDispGeral);
end
else
begin
ShowMessage('Arquivo XML não encontrado.');
end;

//procura outros arquivos .XML na pasta
while FindNext(SearchRec) = 0 do
begin
if FileExists(Dir + Separator + SearchRec.Name) then
begin
FileHandle := SearchRec.Name; //Identificador do arquivo
//criar estrutura para armazenar os dados
xmldcmntDispGeral.FileName := FileHandle;
AdicionaXMLArvore(tvDispositivosDesign,xmldcmntDispGeral);
end
else
begin
ShowMessage('Arquivo XML não encontrado.');
end;
end;
end;

//fecha o recurso SearchRec, pois não será mais usado.
FindClose(SearchRec);
end;
//--------------FIM do Abre arquivos XML na pasta----------------


o AdicionaXMLArvore é esse (até o momento):
//-------------------Adiciona nó XML na árvore-------------------
procedure TfrmLocaisDispositivos.AdicionaXMLArvore(tree: TTreeView;
XMLDoc: TXMLDocument);
var
iNode : IXMLNode;

procedure ProcessNode(Node: IXMLNode; tn: TTreeNode);
begin
if Node = nil then
begin
Exit;
end;
with Node do
begin
tn := tree.Items.AddChild(tn, Attributes['nome']);
end;
end; (*ProcessNode*)
begin
XMLDoc.Active := True;

iNode := XMLDoc.DocumentElement.AttributeNodes.First; //aqui dá uma exceção

if (iNode.Attributes['categoria'] = 'X') then
begin
ProcessNode(iNode,nil); //inserir no nó X, no lugar de nil
end
else //é Y
begin
ProcessNode(iNode,nil); //inserir no nó Y, no lugar de nil
end;

XMLDoc.Active := False;
end;
//-----------------FIM do Adiciona nó XML na árvore-----------------


e um exemplo do XML em questão:
<dispositivo>
<nome>M10</nome>

<versao>01</versao>

<categoria>Teclados</categoria>

...

<saida>Analogica</saida>
</dispositivo>

grato pela atenção


Editado pela última vez por jedi_pereira em Ter Mai 12, 2009 10:55 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Mai 06, 2009 2:19 pm    Assunto: Responder com Citação

Bem amigo isto fez parte de um estudo de caso que fiz e você pode adaptar às suas necessidades e espero que lhe ajude para solucionar o seu caso....



Código:


  public
    { Public declarations }
    procedure DomToTree(XmlNode: IXMLNode; TreeNode: TTreeNode);
  end;

procedure TForm1.DomToTree (XmlNode: IXMLNode; TreeNode: TTreeNode);
var
  I: Integer;
  NewTreeNode: TTreeNode;
  NodeText: string;
  AttrNode: IXMLNode;
begin
  // skip text nodes and other special cases
  if not (XmlNode.NodeType = ntElement) then
    Exit;
  // add the node itself
  NodeText := XmlNode.NodeName;
  if XmlNode.IsTextElement then
    NodeText := NodeText + ' = ' + XmlNode.NodeValue;
  NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);
  // add attributes
  for I := 0 to xmlNode.AttributeNodes.Count - 1 do
  begin
    AttrNode := xmlNode.AttributeNodes.Nodes[I];
    TreeView1.Items.AddChild(NewTreeNode,
      '[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
  end;
  // add each child node
  if XmlNode.HasChildNodes then
    for I := 0 to xmlNode.ChildNodes.Count - 1 do
      DomToTree (xmlNode.ChildNodes.Nodes [I], NewTreeNode);
end;


_________________
P.O.W.E.R B.Y D.E.L.P.H.I


Editado pela última vez por johnny-walker em Qui Jun 27, 2019 9:27 am, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Mai 06, 2009 11:20 pm    Assunto: Responder com Citação

Amigo desculpe-me parece que não passei o modo de utilizar-se da procedure acima...



Código:


procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
     XMLDocument1.Active := False;
     XMLDocument1.LoadFromFile('Books.xml');
     XMLDocument1.Active := True;
     Treeview1.Items.Clear;
     DomToTree(XMLDocument1.DocumentElement, nil);
     TreeView1.FullExpand;
end;





bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I


Editado pela última vez por johnny-walker em Qui Jun 27, 2019 9:19 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
jedi_pereira
Novato
Novato


Registrado: Segunda-Feira, 27 de Abril de 2009
Mensagens: 12

MensagemEnviada: Ter Mai 12, 2009 9:46 am    Assunto: Responder com Citação

valeu pela ajuda...

desculpa a demora, mas o site não gosta do meu Firefox, sempre perde a sessão.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB