Lendo XML com o Delphi


Se você quer ler o XML da NFe, aqui tem um exemplo para download: https://github.com/simasware/acbrNFeExemplo

Boa tarde, pessoal!

Hoje vos trago um tutorial que lhes ensinará a ler um arquivo XML através do Delphi!

O Delphi já possui um componente nativo que é encarregado de ler um arquivo XML, portanto metade do trabalho já está feito, o que ficará por nossa conta é ler os dados contidos entre as tags.

Botando a mão na massa!

Crie um novo projeto no Delphi e adicione no form o componente TXMLDOcument, que se encontra na aba Internet.

Em seguida, abra seu editor de texto favorito ou o Bloco de Notas e cole o seguinte código:

<?xml version="1.0" encoding="windows-1250"?>
<cadastro>
   <pessoa>
      <nome>Fernando de Simas</nome>
      <idade>22</idade>
      <profissao>Analista Desenvolvedor</profissao>
   </pessoa>
</cadastro>

Este será o nosso arquivo de teste. Salve dentro do diretório do projeto (de preferência).  Em seguida, na propriedade FileName do TXMLDocument carregue o arquivo salvo anteriormente.

Agora adicione um TListBox e TButton no formulário.


Agora adicione o seguinte evento no OnClick do botão:

var
   Node : IXMLNode;
begin
   Node := XMLDocument1.DocumentElement.ChildNodes.FindNode('pessoa');
   if (node <> nil) then
   begin
      ListBox1.Items.Add('Nome.....: ' + Node.ChildNodes['nome'].Text);
      ListBox1.Items.Add('Idade....: ' + Node.ChildNodes['idade'].Text);
      ListBox1.Items.Add('Profissao: ' + Node.ChildNodes['profissao'].Text);
   end;
end;

Este processo pode ser usado também para alterar os dados dentro do XML. Basta fazer da seguinte maneira:

Node.ChildNodes['nome'].text := 'SimasWare';
Node.ChildNodes['idade'].text := '1';
Node.ChildNodes['profissao'].text := 'Blog';

É importante ressaltar que para salvar os dados, deve-se usar o método SaveToFile.

Bom, por hoje é só! Dúvidas e sugestões podem ser enviadas para:  simas.ware@hotmail.com ou usar os comentários logo abaixo! 🙂

Para baixar o exemplo completo (Delphi 2009), clique aqui.

UPDATE: aqui um post exemplo de como ler o XML da NFe com ACBr. https://simasware.wordpress.com/2013/03/28/lendo-xml-da-nfe-com-delphi/

Anúncios

25 comentários sobre “Lendo XML com o Delphi

  1. Boa Tarde, nao estou conseguindo ler um XML de uma NFE, alguem pode me ajudar?

    41
    070204600
    VENDAS DE MERCADORIAS SUJEITAS A SUBSTITUICAO TRIBUTARIA
    1
    55
    1
    3023
    2009-08-03
    1
    4125506
    1
    1
    5
    2
    1
    3
    TESTE 1.4.0

    • Bom dia!
      Para visualizar o XML da NFe recomendo o uso da suite ACBr NFe.
      Tem um componente específico para a leitura e geração de XML’s da NFe.

      Att.

  2. Excelente, muito obrigado, de inúmeros posts da web o seu foi o que realmente me ajudou. VLW mesmo
    abraços

  3. Boa dia.Gostaria que me informa-se sobre um erro ocorrendo quando clico no botão.É exibida a mensagem “No Active Document” . Eu coloquei o arquivo no Filename dele e mesmo assim não funcionou,agradeço se me ajudar.

  4. Pessoal,

    Tenho um XML com a seguinte estrutura:

    xxxxxxx

    0001

    0002

    xxxxxxx

    0001

    0002

    se utilizo o codigo sugerido acima para o nó consigo ler apenas 1, pois o ultimo da um erro que não pode ser do tipo element, se tento abri pelo nó , da access violation quando abro o outro pelo childnode.

    Alguém pode me ajudar?

  5. gostaria de receber a conclusao do excelente exemplo. tipo alterar e salvar. como fazer isso. tem como mandar para meu email o exemplo do inicio ao fim ate o comando savetofile?? agradecereo muito. jcnm@ig.com.br. na verdade tenho um banco que compreende:
    entmer.db – cabecalho da nota fiscal) e detent.db (detalhe dos itens) o que pretendo é pegar um arquivo xml de um determinado fornecedor, le ele e salvar dentro desta minha base. agradeco desde ja a informacao complementar do exemplo

    • Para alterar o valor de um node basta fazer assim:
      Node.ChildNodes[‘nome’].Text := ‘Novo valor’

      e para salvar:
      XMLDocument1.SaveToFile(‘nome_do_xml.xml’);

      • estou tantendo ler uma string no xml da nota fiscal eletronica de serviço. A descrição do serviço é grande e quando leio a string me retorna um caractere assim : PALAVRA#$A#$AOUTRA PALAVRA#$A#$AMAIS UMA PALAVRA.

        pode ajudar-me para ter uma string sem os tais caracteres entra as palavras ? Grato pela atenção …Marcos

      • Olá, Marcos!

        Esses caracteres aparecem pois parece que existem quebras de linha na string.
        Tente usar o StringReplace para apagar os caracteres #13 e #10.

        Att.

  6. EAI CARA TO COMEÇANDO A PROGRAMAR..
    E PRECISO DE AJUDA ..
    QUERIA PEGAR A CHAVE DE NOTAS FICAIS ELETRONICAS XML E EXEBIR NA TELA,POREM QUERIA QUE FOSSE COM DBGRID E ABRI-SE VARIAS DE UMA VEZ TIPO SÓ COLOCAR O DIRETÓRIO E ABRIR E EXIBIR NO DBGRID 😉
    MEU CUNHADO FEZ MAS FOI EM CSHARP..
    SE PUDER AJUDAR AGRADEÇO
    ABRAÇO

    –1
    SP_NFE_PL_006j
    ESSA CHAVE AQUI Ó—>>351204044501760001045500100000263617269307372012-04-23T17:06:091351202246540890XCPQk7G82FDAVBy6qK1UYZYwv0=100Autorizado o uso da NF-e

  7. Boa noite!
    o tópico é meio antigo mas estou começando com xml agora
    não consegui obter nenhum valor do arquivos xml. dá acess violation ao acessar o nó
    se alguém poder me ajudar agradeço. uso delphi xe7


    3.6
    1
    136

    1

    1
    OPERADORA
    2010-04-12 14:35:09
    NORMAL

    3
    MG
    BA
    SE

    …..

    fiz assim…
    procedure TFrmPrincipal.PercorreXML;
    var
    XMLDoc : TxmlDocument;
    Ndcellcard, Ndoperadoras, NdOperadora, ndOpEstados,
    ndprodutos, ndproduto, ndUFpin, ndDDDOnline, ndSec, NdTemp : Ixmlnode;
    begin
    // carrega XML
    XMLDoc := TxmlDocument.create(self);
    XMLDoc.LoadFromFile(‘arquivo.xml’);
    XMLDoc.Active := True;

    Ndcellcard := XMLDoc.DocumentElement.childNodes.FindNode(‘cellcard’);
    // Ndcellcard.childNodes.first; <<<<<— deu acess violation aqui
    repeat
    begin
    NdOperadoras := Ndcellcard.ChildNodes['operadoras']; <<<<<— deu acess violation aqui também
    // NdOperadoras.childNodes.first;
    repeat
    begin
    NdOperadora := ndoperadoras.childNodes['operadora'];
    NdOperadora.childNodes.first;
    repeat
    begin
    idOp := Ndoperadora.ChildNodes['codigoOperadora'].text;
    nomeOp := Ndoperadora.ChildNodes['nomeOperadora'].text;
    dtop := Ndoperadora.ChildNodes['ultimaAtualizacaoOperadora'].text;
    tpOp := Ndoperadora.ChildNodes['tipoOperadora'].text;

    CarregaOperadora;

    ndOpEstados := ndoperadora.ChildNodes['estadosAtuantes'];
    ndOpEstados.childNodes.first;
    repeat
    begin
    UfOp := ndOpEstados.ChildNodes['estadoOperadora'].text;

    CarregaEstadoOperadora;
    ndOpEstados := ndOpEstados.NextSibling;
    end;
    until ndOpEstados = nil;

  8. não saio os dados do xml
    / –
    / 3.6
    / 1
    / 136
    / –
    / 1
    / –
    / 1
    / OPERADORA
    / 2010-04-12 14:35:09
    / NORMAL
    / –
    / 3
    / MG
    / BA
    / SE
    /

    • Bom dia, Ticiano!

      Tem um problema (que ainda não consegui desvendar) quando se instancia um TXMLDocument em tempo de execução.
      Tente adicionar um TXMLDocument no seu formulário e utilize ele.

      Att,
      Fernando.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s