Lendo o XML com o TXMLDocument
Código-Fonte, Delphi outubro 20th, 2008
Algumas pessoas têm me procurado com muitas dúvidas sobre gerar um arquivo XML; mas, ultimamente, principalmente, como fazer para ler os dados de um XML. Já mostrei como fazer isso usando o utilitário que acompanha o Delphi “XML Mapper”; o qual uso muito (veja o post) quando preciso integrar um arquivo XML com meu sistema de forma definitiva.
Outra forma de executar a leitura parcial ou total de um arquivo XML é usando o componente TXMLDocument; com ele vc. pode buscar facilmente a informação que vc precisa dentro do arquivo; no código exemplo, que disponibilizo abaixo: vamos ler os itens do arquivo exemplo gerado no post “Dados XML como começar” (poderia ser usado para ler os itens da sua NF-e com pequenos ajustes):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | procedure TForm1.Button32Click(Sender: TObject); var vXMLDoc: TXMLDocument; NodePai,NodeSec,NodeTmp: IXMLNode; nome, codigo: WideString; begin // Cria a variável baseada no TXMLDocument vXMLDoc := TXMLDocument.Create(self); // Le conteúdo do arquivo XML informado vXMLDoc.LoadFromFile('EnviNFe.xml'); // Poderia ser uma URL como abaixo: //vXMLDoc.FileName := 'http://www.caiooliveira.com.br/?feed=rss2'; //vXMLDoc.Active := True; // Vou colocar os dados no memo apenas como exemplo Memo.lines.Add( '-------------------------------------------------'); Memo.lines.Add( 'Vamos inserir num campo memo (apenas para ver o resultado do teste'); Memo.lines.Add( VXMLDoc.XML.Text +#13+#13 ); // Aqui eu peço para encontrar a primeira ocorrencia da Tag <det>> NodePai := vXMLDoc.DocumentElement.childNodes.First.ChildNodes.FindNode('det'); // Esse nó vai ser usado no LOOP NodeSec := NodePai; // Posiciona o primeiro elemento encontrado NodeSec.ChildNodes.First; repeat // referencia a tag <prod> dentro de <det> NodeTmp := NodeSec.ChildNodes['prod']; // da pra ver que é um XML resumido da NFe (so temos uma tag <prod> para cada <det> então não precisaria da linha abaixo // agora se tivéssemos mais de uma seria o caso de posicionar também na primeira ocorrencia. NodeTmp.ChildNodes.First; repeat // pega os dados que vc quiser dentro da tag <prod> nome := NodeTmp.ChildNodes['cProd'].text; // posso ler assim codigo := NodeTmp.ChildValues['cEan']; // ou assim // vamos inserir no Memo os dados Memo4.Lines.Add('-----------------------------------------------'); Memo4.Lines.Add( nome+' ---- '+codigo ); // vai para a proxima ocorrência <prod> (se houvesse) NodeTmp := NodeTmp.NextSibling; until NodeTmp = nil; // vai para a proxima ocorrência <det> NodeSec := NodeSec.NextSibling; until NodeSec = nil; end; |