Muitos ainda têm dúvida de como ler o XML usando o TXMLDocument; publiquei abaixo mais dois códigos exemplo, o primeiro para ler o arquivo de retorno da consulta de Status do Serviço da NF-e e o segundo para ler o arquivo de retorno da consulta do recibo de envio do lote da NF-e. Reparem que são poucas modificações em relação aos exemplos anteriores, usem esses exemplos também para entender melhor como usar o TXMLDocument e ganhe maior liberdade para trabalhar com qualquer arquivo XML.

Ex.01: Lendo o XML de retorno da consulta de Status de Serviço da NF-e:

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
var vXMLDoc: TXMLDocument;
    NodeRec, NodeRec2: IXMLNode;
    cStat, dhRecebto, motivo: WideString;
begin
  vXMLDoc := TXMLDocument.Create(self);
  Try
  // abre o XML
  vXMLDoc.LoadFromFile('c:\tempo\navcom\nfe\consStatServ_001.xml');
 
  // Mostra no memo (aqui apenas para exemplificar)
  Memo4.lines.Add( VXMLDoc.XML.Text +#13+#13 );
 
  // Le os dados contido nó principal 
  with vXMLDoc.DocumentElement  do
  begin
    motivo :=    ChildNodes['xMotivo'].text;
    cStat  :=    ChildNodes['cStat'].text;
    dhRecebto := ChildNodes['cStat'].text;
  end;
 
  // Mostra os dados no memo (apenas exemplificando) 
  Memo4.Lines.Add('-----------------------------------------------');
  Memo4.Lines.Add( cStat+' ---- '+motivo+' - '+dhRecebto );
 
  finally
     VXMLDoc.Free;
  end;
end;

Exemplo 02: Lendo o XML de retorno da consulta do recibo de envio da NF-e

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
var vXMLDoc: TXMLDocument;
    NodeRec, NodeRec2: IXMLNode;
    cStat, nRec, xMotivo, cStat2, nProt, xMotivo2, dhRecbto: WideString;
begin
  vXMLDoc := TXMLDocument.Create(self);
  try  
  vXMLDoc.LoadFromFile('c:\tempo\navcom\nfe\retConsLote_001.xml'); //EnviNFe.xml');
 
  Memo.lines.Add( '-------------------------------------------------');
  Memo.lines.Add( VXMLDoc.XML.Text +#13+#13 );
 
  // Lê os dados do Nó principal
  With vXMLDoc.DocumentElement do
  begin
     nRec := ChildNodes['nRec'].text;
     cStat:= ChildNodes['cStat'].text;
     xMotivo := ChildNodes['xMotivo'].text;
  end;
 
  // Lê os dados de "protNFe"
  NodeRec := vXMLDoc.DocumentElement.ChildNodes.FindNode('protNFe');
  NodeRec2:= NodeRec.ChildNodes.FindNode('infProt');
  dhRecbto := NodeRec2.ChildNodes['dhRecbto'].text;     // posso ler assim
  cStat2   := NodeRec2.ChildNodes['cStat'].text;
  nProt    := NodeRec2.ChildNodes['nProt'].text;
  xMotivo2 := NodeRec2.ChildNodes['xMotivo'].text;
 
  // Mostra os dados (apenas exemplificando aqui)
  Memo.Lines.Add('Dados do Recibo -------------------------------------------');
  Memo.Lines.Add(
  'Recibo N.: '+nRec+#13+#10 +
  'Status: '+cStat+#13+#10 +
  'Motivo: '+xMotivo+#13+#10 );
  Memo.Lines.Add('Dados do Protocolo -------------------------------------------');
  Memo.Lines.Add(
  'Motivo: '+xMotivo2+#13+#10+
  'Status: '+cStat2+#13+#10+
  'Protocolo de autorização N.: '+nProt+#13+#10+
  'Data Recebimento: '+dhRecbto);  
  finally
     VXMLDoc.Free;
  end;   
end;

Posts Relacionados

Tags: ,



47 Comentários

  • At 2008.12.19 09:47, Alaercio said:

    Caio, tenho a seguinte tag:

    -
    0000000125
    -
    -

    Eu preciso ler o campo Id da TAG infNFe que contem a chave de acesso, mas como ela nao esta dentro e sim junto com a Tag infNFe não consegui ler com o exemplo acima, oque tenho que mudar para ler este campo, tanto Id como Versao que fica junto da TAG

    obrigado

    • At 2008.12.19 10:04, Alaercio said:

      Desculpe a Tag não foi no comentario anterior , mas seria um xml de envio de lote, obrigado

      • At 2008.12.19 10:09, Caio Oliveira said:

        Olá Alaercio,

        Para ler o “Id” que é um atributo da tag “infNFe” vc pode usar o código abaixo:

            NodePai := vXMLDoc.DocumentElement.ChildNodes.FindNode('infNFe');
           Id := NodePai.GetAttributeNS('Id','');
        • At 2008.12.19 11:51, Alaercio said:

          Perfeito,mais uma vez obrigado, um otimo final de ano e boas festas para vc e sua familia

          • At 2009.02.11 06:44, Luciano said:

            Caio,

            Como faz para ler o arquivo retorno a partir do RichEdit.

            Abraço,

            Luciano

            • At 2009.02.11 09:35, admin said:

              Olá Luciano,

              Na verdade, isso não é possível, vc. pode ler o arquivo de retorno usando o TXMLDocument (como no exemplo) e, em seguida mostrar o resultado usando um “RichEdit”. No nosso exemplo, usamos o “Memo” apenas para mostrar os dados, assim como vc poderia usar o “RichEdit” um “MessageBox”, etc.

              Exceto, se vc quisesse apenas abrir o arquivo XML na tela (sem interpretação dos dados); nesse caso vc poderia abrir o arquivo com um comando semelhante ao abaixo:

              RichEdit1.Lines.LoadFromFile('c:\tempo\navcom\nfe\retConsLote_001.xml');

              Mas, nesse caso, acredito que o resultado não seria satisfatório, visto que, o XML, embora possa ser interpretado à “olho nú”, não seria muito amigável.

              O correto é usar um componente capaz de fazer o “parser” (a interpretação) do arquivo XML (como o TXMLDocument) e então vc. pega os dados que precisa e mostra ou salva no seu sistema para melhor controle.

              Sds, Caio

              • At 2009.02.13 13:27, Alencar said:

                Boa tarde caio,

                Só q meu arquivo de retorno tem tantas tags “protNFe e infProt” quantas NFe’s q envio. se mandar 10 NFe tera 10 conjunto dessas tags. Eu não consegui pergar elas separadamente, como se eu precisasse de incrementar a linha de consulta.

                Desde ja Agradeço

                Att

                • At 2009.02.13 14:10, Caio said:

                  Alencar,

                  Dá uma olhada nesse post http://www.caiooliveira.com.br/?p=73 para ver como implementar o “loop”.

                  Caso não consiga à partir do exemplo me diga que preparo um exemplo.

                  Sds,

                  • At 2009.03.05 13:32, Vanessa said:

                    Caio, preciso muito da sua ajuda, to gerando o arquivo, assino, valido e dá que o xml está ok, qndo envio o arquivo é rejeitado, ja conferi todo o layout e nada, preciso disponibilizar o sistema na semana que vem, posso te enviar o arquivo para me ajudar a achar o problema?

                    Desde já obrigada

                    • At 2009.03.05 15:08, admin said:

                      Olá Vanessa,

                      Qual o motivo da rejeição (a mensagem de retorno)?.

                      Sds,

                      • At 2009.03.05 15:28, Vanessa said:

                        O erro:

                        2SP_NFE_PL_005c350000002933075225Rejeição: Falha no Schema XML da NFe35

                        • At 2009.03.05 15:28, Vanessa said:

                          2SP_NFE_PL_005c350000002933075225Rejeição: Falha no Schema XML da NFe35

                          • At 2009.03.05 15:40, admin said:

                            Certo,

                            Você precisa validar o seu arquivo XML e para isso vc. pode usar a função “validaXML” da NFE_UTIL.dll a mensagem de retorno deve lhe ser util para encontrar a falha.

                            Sds,

                            • At 2009.03.09 10:05, Vanessa said:

                              validei com a dll, me apresenta que não existe erros, mas mesmo assim meu arquivo não é integrado.
                              Tem mais alguma possibilidade?

                              Grata,

                              Vanessa

                              • At 2009.03.09 12:27, admin said:

                                Olá Vanessa,

                                Normalmente, em caso de retorno de falha de esquema, após a validação do arquivo; vc deve verificar: caracteres especiais no seu texto ( +, %, &, etc) nem todas as UF criticam isso. Outro item que causa constantes falhas de esquema: espaço duplo entre caractres (Ex. FERRAMENTA||DE|CORTE); inseri a barra para exemplificar; ou ainda texto com espaços em branco no final (Ex. FERRAMENTA|DE|CORTE|).

                                Infelizmente a SEFAZ devolve apenas a mensagem “falha de esquema” nesses casos, não sendo possível identificar o problema de imediato.

                                Sds, Caio

                                • At 2009.03.10 11:40, carlos said:

                                  Bom dia caio estou com um duvida..sobre o envio NFe….peguei essa dll (NFe_Util.dll) esta funcionando so para pegar a assinatura..para gerar o arquivo xml e peguei aquela tua dica e esta funcionando…agora para enviar nao estou conseguindo com a dll como faço…um abraço e obrigado

                                  • At 2009.03.10 15:30, admin said:

                                    Olá carlos,

                                    Antes de qualquer coisa, não deixe de dar uma olhada na pasta “exemplos” que vem junto com a DLL. Tem muita informação ali (quase tudo que precisa).

                                    Vc pode usar a função “EnviaLote/EnviaLoteSCAN” para enviar um lote de NFe´s ou, “EnviaNFeSCAN”. Tem exemplo em delphi pronto, basta adatptar no seu programa.

                                    Sds

                                    • At 2009.04.01 16:10, Carol said:

                                      Olá Caio,

                                      Vi que você somente comentou sobre o envio da nfe.
                                      Você conseguiu testar a solicitação do recibo.
                                      Estou com erro de validação do Schema XML do cabeçalho.
                                      Teria alguma idéia do que pode ser?
                                      Obrigada

                                      • At 2009.04.02 08:31, admin said:

                                        Olá Carol,

                                        O erro de no Schema XML pode ser visto na hora da validação do arquivo. Alguns erros; bem como: caracteres inválidos, espaços duplos entre palavras, código ou valores inválidos (IBGE, Inscrição Estadual, etc) etc; que poderão fazer com que o serviço da SEFAZ devolva como falha de schema.

                                        Sds,

                                        • At 2009.04.02 09:14, Carol said:

                                          Mas aí que está meu problema, eu faço a verificação e está ok, não há caracteres inválidos.
                                          É somente o código de consulta.
                                          Será que tem algo errado?
                                          Meu xml ficou assim:
                                          cabeçalho:
                                          1.10

                                          mensagem:
                                          2350000003546608

                                          É a consulta simples e básica do recibo.
                                          Me retorna erro 242 – Rejeição do schema do cabeçalho. Não consigo achar o pq do erro, se o mesmo cabeçalho uso no envio (recepção nfe) e funciona.
                                          Tem alguma idéia?

                                          • At 2009.04.02 09:23, Carol said:

                                            desculpe não foi o código

                                            cabeçalho:
                                            ||||||1.10||||

                                            mensagem:
                                            ||||||2||||350000003546608||||

                                            Desconsidera as “|”, é só pro código aparecer.

                                            • At 2009.04.02 09:23, Carol said:

                                              Como te mando os códigos?

                                              • At 2009.04.02 10:42, Caio said:

                                                Carol,

                                                Mande o seu XML para caio@caiooliveira.com.br

                                                • At 2009.04.08 11:34, Fernando Fernandes said:

                                                  Caio,

                                                  estou com o seguinte problema:
                                                  Estou usando o certificado digital do serasa (cartão/leitora). Consigo enviar as NFes mas quando vou buscar o retorno dá a seguinte mensagem:

                                                  ‘An invalid character was found in text content.
                                                  Line 17
                                                  Rejeicao: Erro n.

                                                  O que pode ser?

                                                  Grato.

                                                  • At 2009.04.08 12:19, admin said:

                                                    Olá,

                                                    Não deve ser problema com a instalação do seu certificado, já que está conseguindo enviar a NF-e sem problemas. Vc. chega a receber o XML retorno? ou ocorre esse erro antes da resposta?

                                                    Me lembro de um caso (DF ou MS não me lembro qual SEFAZ) onde o retorno vinha com acentos e dava erro quando ia abrir; então tive que usar uma função para remover os acentos antes de gravar o XML retorno.

                                                    Sds,

                                                    • At 2009.04.08 13:29, Fernando Fernandes said:

                                                      Caio,

                                                      O erro acontece quando eu recebo o retorno.
                                                      Quando envio tah ok. o erro ocorre antes de receber o retorno.

                                                      • At 2009.04.13 08:47, admin said:

                                                        Olá Fernando,

                                                        Desculpe a demora, para lhe responder. Faça um tratamento de exceção (try,except) e tenta salvar o conteúdo das variáveis: retWS e msg.

                                                        Sds,

                                                        • At 2009.04.14 12:45, Fernando Fernandes said:

                                                          Caio,

                                                          Fiz um tratamento de exceção (try,except) e salvar o conteúdo das variáveis: retWS e msg.

                                                          XML de retorno:

                                                          2
                                                          1.10
                                                          310000002737537
                                                          104
                                                          Lote processado
                                                          31

                                                          2
                                                          1.10
                                                          31090419023100000161550010000000290000005777
                                                          2009-04-14T11:44:48
                                                          EDyg3/oGMTsbnyQLOACoTbzUxPI=
                                                          999
                                                          Rejeicao: Erro não catalogado não foi possível encontrar o certificado da AC

                                                          No retorno da a seguinte mensagem:

                                                          An invalid character was found in text content.
                                                          Line 7
                                                          Rejeicao: Erro n.

                                                          • At 2009.04.14 15:15, Caio said:

                                                            Olá Fernando,

                                                            Verifique se a cadeia de certificados correspondente ao seu certificado ou alguma outra cadeia exigida pela SEFAZ da UF 31; está instalada.

                                                            Repare que o XML retorno contém acentos e por isso dá erro. Eu usei uma função para remover os acentos antes de salvar o arquivo.

                                                            Sds,

                                                            • At 2009.06.01 08:14, Anderson said:

                                                              Olá Caio,

                                                              Estou com um problema.
                                                              Quando gero o xml para consultar o status do serviço ele sempre é gerado com “xmlns=” antes de algumas tags como abaixo:

                                                              -
                                                              1
                                                              31
                                                              STATUS

                                                              Estou usando o seguinte código pra gerar:

                                                              with oXmlDocument do
                                                              begin

                                                              //Cabeçalho do xml
                                                              Active := True;
                                                              Version := ’1.0′;
                                                              Encoding := ‘UTF-8′;

                                                              //Atributos do no consStatServ
                                                              AddChild(‘consStatServ’);
                                                              DocumentElement.Attributes['xmlns:xsi'] :=
                                                              ‘http://www.w3.org/2001/XMLSchema-instance’;
                                                              DocumentElement.Attributes['xmlns:xsd'] :=
                                                              ‘http://www.w3.org/2001/XMLSchema’;
                                                              DocumentElement.Attributes['versao'] := ’1.07′;
                                                              DocumentElement.Attributes['xmlns']:= ‘http://www.portalfiscal.inf.br/nfe’;

                                                              ChildNodes['consStatServ'].AddChild(‘tpAmb’).NodeValue := ’1′;
                                                              ChildNodes['consStatServ'].AddChild(‘cUF’).NodeValue := ’31′;
                                                              ChildNodes['consStatServ'].AddChild(‘xSServ’).NodeValue := ‘STATUS’;
                                                              NodeNivelA := DocumentElement;

                                                              oXmlDocument.SaveToFile(‘d:\ped-sta.xml’);

                                                              O que estou fazendo de errado?

                                                              Obrigado.

                                                              • At 2009.06.01 08:16, Anderson said:

                                                                Segue o xml comentado:


                                                                -
                                                                1
                                                                31
                                                                STATUS

                                                                • At 2009.06.01 11:44, admin said:

                                                                  Olá Anderson,

                                                                  Experimente incluir os attributos como abaixo:

                                                                  Active := True;
                                                                         Version := '1.0';
                                                                         Encoding := 'UTF-8';
                                                                         AddChild( 'consStatServ','http://www.portalfiscal.inf.br/nfe');
                                                                         DocumentElement.Attributes['xmlns:xsi'] :=
                                                                         'http://www.w3.org/2001/XMLSchema-instance';
                                                                  • At 2009.06.02 14:15, Alexandre Diogenes said:

                                                                    Prezado, gostaria de receber uma ajuda, desenvolvi um sistema para trabalhar com a NFE, todos os procedimentos foram feitos em ambiente de teste, exeto um o de inutilização de numeração,o mesmo apresenta uma mensagem no qual diz´´ falha na validação dos dados da inutilização“, o pior é o que na minha máquina em que eu programo e serviço é executado normalmente. Tem alguma dica do que pode estar faltando nestas outras máquinas.lembramdo que foi feito instalações identicas em duas maquinas diferentes e mesmo assim não funciona.

                                                                    Agradeço desde já.

                                                                    • At 2009.06.02 15:37, admin said:

                                                                      Olá Alexandre,

                                                                      Repare que para inutilizar um número de NF-e, não pode ser uma NF-e autorizada ou cancelada; será que não é esse o seu caso?

                                                                      Sds,

                                                                      • At 2009.06.16 10:05, berdam said:

                                                                        Olá Caio, estou lendo o xml para retornar o protocolo com a NFe util.dll, recebo o XML do WS tranquilamente, porém ao tentar ler acontece um erro ‘invalid pointer operation’.

                                                                        Esse erro acontece na primeira chamada da variável NodeRecm onde tento encontrar a tag retConsSitNFe.

                                                                        XmlProtocolo := TXmlDocument.Create(nil);
                                                                        XmlProtocolo.XML.Add(retWS);
                                                                        XmlProtocolo.Active :=true;

                                                                        NodeRec := XmlProtocolo.DocumentElement.ChildNodes.FindNode(‘retConsSitNFe’);
                                                                        NodeRec2:= NodeRec.ChildNodes.FindNode(‘infProt’);
                                                                        stProt := NodeRec2.ChildNodes['nProt'].text;

                                                                        Meu Xml é esse

                                                                        2SVRS20080807101332100
                                                                        Autorizado o uso da NF-e
                                                                        42420905853228400001235500100006409766545620062009-06-16T08:32:16
                                                                        342090000844949
                                                                        HMPJt7GSi5Wo2wgPw2ypeSxWIsk=

                                                                        • At 2009.06.16 15:01, berdam said:

                                                                          Outra coisa caio, esse erro apenas ocorre quando crio o componente Xmldocument de maneira dinãmica, se eu coloco o componente em algum form, o erro não ocorre.

                                                                          • At 2009.06.17 14:53, João Paulo de Oliveira said:

                                                                            Anderson,

                                                                            Muito obrigado pelas postagens acima, com estas informações consegui resolver os problema que eu tinha

                                                                            • At 2009.06.17 15:36, admin said:

                                                                              Berdam,

                                                                              Experimenta assim:

                                                                              XmlProtocolo := TXmlDocument.Create(nil);
                                                                              XmlProtocolo.XML.Add(retWS);
                                                                              XmlProtocolo.Active :=true;
                                                                               
                                                                              NodeRec := XmlProtocolo.DocumentElement;
                                                                              NodeRec2:= NodeRec.ChildNodes.FindNode(’infProt’);
                                                                              stProt := NodeRec2.ChildNodes['nProt'].text;
                                                                              • At 2009.06.17 15:36, admin said:

                                                                                Legal Anderson.

                                                                                • At 2009.06.18 14:14, berdam said:

                                                                                  Olá cario, resolvi o problema usando ao invés de IxmlDocument ao invés de TXmlDocument

                                                                                  • At 2009.06.18 14:16, berdam said:

                                                                                    Opa errei tudo.

                                                                                    Olá caio, resolvi o problema ao invés de TXmlDocument usei IxmlDocument

                                                                                    • At 2009.06.18 17:44, admin said:

                                                                                      legal, sucesso!

                                                                                      • At 2009.08.18 09:30, Kátia de Oliveira said:

                                                                                        Olá Caio, muito obrigada por este blog, que Deus te abençoe, iluminando seus passos. Você tem um coração generoso, e isto tem sido muito importante pra mim. vc está sendo meu salva-vida. rsrs.

                                                                                        bjos fique na paz de Deus

                                                                                        • At 2009.08.18 14:40, Caio said:

                                                                                          Bom saber Kátia, sucesso e paz para vc também.

                                                                                          • At 2010.04.09 16:59, Ediclebio Batista said:

                                                                                            Olá Caio,
                                                                                            Com um cliente nosso aconteceu o seguinte: foi enviado a NF-e, autorizada satisfatoriamente (visualizado pelo portal) porém o arquivo XML não foi recebido.
                                                                                            O que será que aconteceu: problemas com o webservice?

                                                                                            • At 2010.06.21 16:36, junior said:

                                                                                              boa tarde caio,

                                                                                              estou com o seguinte problema.
                                                                                              gera toda a nf-e normal, porem no xml nao consta o retorno, o arquivo de retorno nao inclui os dados no xml da nf-e

                                                                                              ele gera 4 arquivos separados. mas no xml nao aparece o retorno

                                                                                              ja apareceu algo assim para voce?

                                                                                              • At 2011.03.03 12:19, Ricardo said:

                                                                                                Caio como vai tubo bem ?
                                                                                                Na consulta de protocolo da nfe, me retonra 2 formatos de XML, quando autorizado o uso cStat = 100, blz.. eu consigo ler, mas quando vem alguma outra mensagem não consigo ler pois os nodes são diferentes:
                                                                                                Exemplo:

                                                                                                1
                                                                                                2.00
                                                                                                217
                                                                                                Rejeicao: NF-e nao consta na base de dados da SEFAZ
                                                                                                51
                                                                                                51110301008083000128550010000000405000000406

                                                                                                No exemplo acima como fica o node pai ?

                                                                                                Obrigado
                                                                                                Ricardo

                                                                                                You must be logged in to post a comment.