|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
jedi_pereira Novato
Registrado: Segunda-Feira, 27 de Abril de 2009 Mensagens: 12
|
Enviada: Qua Mai 06, 2009 11:28 am Assunto: Ler XML e adicionar na TreeView [RESOLVIDO] |
|
|
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 |
|
|
johnny-walker Moderador
Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Mai 06, 2009 2:19 pm Assunto: |
|
|
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 |
|
|
johnny-walker Moderador
Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Mai 06, 2009 11:20 pm Assunto: |
|
|
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 |
|
|
jedi_pereira Novato
Registrado: Segunda-Feira, 27 de Abril de 2009 Mensagens: 12
|
Enviada: Ter Mai 12, 2009 9:46 am Assunto: |
|
|
valeu pela ajuda...
desculpa a demora, mas o site não gosta do meu Firefox, sempre perde a sessão. |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|