Segue abaixo um exemplo, usando a classe TXMLDocument do Delphi, para gerar um arquivo XML; repare que o arquivo está incompleto, mas servirá como base para quem não sabe ainda por onde começar.

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
procedure TfrmPrincipal.PnLerNfeClick(Sender: TObject);
var vXMLDoc: TXMLDocument;
    NodeNivelA, NodeNivelB: IXMLNode;
 
begin
 
  vXMLDoc := TXMLDocument.Create(self);
  Try
  With vXMLDoc do begin
       Active := True;
       Version := '1.0';
       Encoding := 'UTF-8';
       AddChild('NFe','http://www.portalfiscal.inf.br/nfe');
       DocumentElement.Attributes['xmlns:ds'] :=
       'http://www.w3.org/2000/09/xmldsig#';
       DocumentElement.Attributes['xmlns:xsi'] :=
       'http://www.w3.org/2001/XMLSchema-instance';
       DocumentElement.Attributes['xsi:schemaLocation'] :=
       'http://www.portalfiscal.inf.br/nfe/enviNFe_v1.12.xsd';
 
       // A - Dados da Nota Fiscal eletrônica
       NodeNivelA := DocumentElement;
       // Adiciona a Tag
       NodeNivelA.AddChild('infNFe');
       // Adiciona atributo "Id" da Tag anterior
       NodeNivelA.ChildNodes['infNFe'].Attributes['Id'] := 'NFe31232131232132131231221312312312';
       // Adiciona atributo "versao" da Tag anterior
       NodeNivelA.ChildNodes['infNFe'].Attributes['versao'] :=
            DM.ClientDSLoja.FieldByName('enviNFe').AsString;
 
       // B - Identificação da Nota Fiscal eletrônica
       NodeNivelB := NodeNivelA.ChildNodes['infNFe'];
       NodeNivelB.ChildNodes['ide'].AddChild('cUF').NodeValue := '51' ;
       NodeNivelB.ChildNodes['ide'].AddChild('cNF').NodeValue := '000001';
 
       vXMLDoc.SaveToFile('EnviNFe.xml');
 
  end;
  finally
     vXMLDoc.Free;
  end;
 
end;

Ps. Acrescente as units: XMLDoc, XMLIntf, xmldom.

Posts Relacionados

Tags: , ,



30 Comentários

  • At 2008.09.27 12:40, Eremar said:

    Meus parabens foi a primeira explicação do componente TXMLDocument que até agora funcionou certinho. simples e objetiva.

    Obrigado pela dica.

    • At 2008.10.01 09:31, Marcos Jr said:

      Ótima dica!

      eu procurei algo a respeito por horas e não encontrei nada tão pratico.

      Valeu

      • At 2008.10.05 10:34, Janete said:

        Não estou conseguindo dar sequência na hora de discriminar os ítens vendido…

        - ///não sei como fazer gerar esse codigo

        Alguém pode me ajudar?

        • At 2008.10.10 15:17, Jeferson said:

          Seguindo esta sua forma de criar o xml… como ficaria os itens? Digo como faço desta forma para adicionar varios produtos na mesma nota da nfe?
          Se puder me manda um exemplo, pois segui esta sua forma de programar e gerei meu xml com um item, que esta OK, mas porem se a nota tiver mais de um item, fica salvo somente o ultimo… O que fazer???
          Delphi 7 pro.

          • At 2008.10.10 15:19, Jeferson said:

            Parabéns pela Dica. Muito valiosa, me ajudou muito…
            Só falta os itens…

            • At 2008.10.10 15:25, Olimpio Rocha said:

              Post isso, muita gente procura e não acha como fazer o XML repetir várias vezes um mesmo campo.

              procedure TForm1.Button1Click(Sender: TObject);
              var
              xml : TXMLDocument;
              no_raiz, no_Sub1, no_Sub2, no_sub3 : IXMLNode;
              i, j : integer;
              begin
              xml:=TXMLDocument.Create(nil);
              xml.Active:=TRUE;

              //no raiz
              xml.Version := ’1.0′;
              xml.Encoding := ‘iso-8859-1′;

              no_raiz:=xml.Node.AddChild(‘NotaFiscal’);

              //dados de romaneios
              no_sub1:=no_raiz.AddChild(‘Romaneios’);
              for j:=1 to 2 do
              begin
              no_sub2:=no_sub1.AddChild(‘romaneio’);
              no_sub1.ChildNodes['romaneio'].Attributes['Cor']:=’Azul’;

              no_sub2.AddChild(‘numero’).NodeValue:=inttostr(j);
              no_sub2.AddChild(‘data’).NodeValue:=’data ‘+inttostr(j);

              //dados de itens
              no_sub2:=no_sub2.AddChild(‘itens’);
              for i:=1 to 3 do
              begin
              no_sub3:=no_sub2.AddChild(‘produto’);
              no_sub3.AddChild(‘codigo’).NodeValue:=inttostr(i);
              no_sub3.AddChild(‘descricao’).NodeValue:=’pro ‘+inttostr(i);
              end;
              end;

              xml.SaveToFile(‘c:\teste.xml’);

              xml.Active:=False;
              xml:=nil;
              end;

              • At 2008.10.15 09:10, Junior said:

                Olá,

                Estou em um projeto para gerar os xml’s e ainda não decide qual tecnologia utilizar, sem duvida o TXMLDocument é um dos caminhos.

                Obrigado pela dica!

                • At 2008.10.16 14:14, Isa said:

                  nao consigo dar sequência na hora de discriminar os itens vendidos.

                  Na verdade, nunca mexi com xml, entao estou apanhando há dias pra tentar terminar a geracao do xml.

                  se alguem puder ajudar agradeço!

                  • At 2008.10.23 10:00, Filipe said:

                    Obrigado pela explicação.
                    O código está muito bem comentado.

                    Parabens pelo trabalho que você tem feito no site,.

                    Obrigado

                    • At 2008.10.24 09:28, Filipe said:

                      Oi.

                      Sou iniciante em Delphi e primeira vez que uso o XML e surgiu uma dúvida: para que serve essa parte do código?
                      É necessário passar esses atributos para fazer o XML no Delphi? Porque estou fazendo um sistema que tem que gera o XML das informações do formulário e quando eu tirei do meu código essa parte do código deu erro no Delphi quando eu mandei rodar. O que é XMLNS?

                      AddChild(‘NFe’,'http://www.portalfiscal.inf.br/nfe’);
                      DocumentElement.Attributes['xmlns:ds'] :=
                      ‘http://www.w3.org/2000/09/xmldsig#’;
                      DocumentElement.Attributes['xmlns:xsi'] :=
                      ‘http://www.w3.org/2001/XMLSchema-instance’;
                      DocumentElement.Attributes['xsi:schemaLocation'] :=
                      ‘http://www.portalfiscal.inf.br/nfe/enviNFe_v1.12.xsd’;

                      São muitas perguntas. xP
                      Agradeço desde já pela ajuda.

                      • At 2008.10.24 09:50, Filipe said:

                        Oi.

                        Já resolvi o problema.
                        Pode desconsiderar o comentário anterior.

                        Vlw

                        • At 2008.12.10 14:32, Nilton Cleverson de Oliveira said:

                          Explicação obxetiva e especifíca me ajudou muito agora é so adaptar ao meu projeto muito grato pela sua explicação mais para frente gostaria de poder colocar as fontes do programa ai para o aprendizado gratuitamente muito obridado

                          • At 2009.05.12 14:46, Wellington Costa said:

                            Caio,

                            Você tem conhecimento do uso do XML Data Binding do Delphi 2007 para gerar o XML da NFe?

                            Eu estou tentando, mas parece que só funciona no Win32. Quando uso o Wizard do DataBinding em um projeto Win32 ele gera sem erros. Já em um projeto .NET ele gera, porem com erros.

                            Realmente não consigo usá-lo em uma aplicação .NET?

                            Desde já agradeço,
                            Wellington Costa

                            • At 2009.05.13 11:00, admin said:

                              Olá Wellington,

                              Eu não uso o Delphi 2007; o meu BDS 2006 não tem esse recurso ainda, então não vou poder ajudar muito. Mas, dá uma olhada nesse video (http://blog.codebeach.com/2008/08/xml-data-binding-in-delphi.html). Deve ajudar.

                              Sds,

                              • At 2009.06.02 14:50, Alan Alencar da Silva said:

                                Boa tarde

                                Estou gerando o xml da nfe seguindo o seu exemplo e esta gerando ok. Porem ao assinar usando o nfe_util.dll ele dá um erro:

                                An XMLDocument context is required for enveloped transforms.

                                O que poderia ser??

                                Só acontece com o xml gerado pelo delphi.

                                • At 2009.06.02 15:34, admin said:

                                  Olá Alan,

                                  Veja nos exemplos que acampanham a NFe_util.dll ali tem um modelo de código para executar a assinatura do arquivo da NF-e.

                                  Sds,

                                  • At 2009.06.03 07:43, Alan Alencar da Silva said:

                                    Bom dia

                                    Utilizei o codigo exemplo do NFe_util.dll, só não consegui assinar os xmls gerados pelo delphi. XML´s de exemplo que consegui na internet consigo validar. Uma curiosidade, os xmls que consegui validar, quando abro no bloco de notas tem um caracter parecido com um quadrado após o fechamento das tag´s

                                    Att

                                    Alan

                                    • At 2009.06.03 10:15, Caio said:

                                      Bom dia Alan,

                                      Antes de mais nada, faça uma nova validação do seu XML. Acesse o link abaixo tem um validador on-line onde vc. pode colar o seu XML e validar ali mesmo.

                                      http://nfe.fazenda.df.gov.br/

                                      Escolha no menu a opção “validador” em seguida cole o seu XML na área de texto e acione “validar”.

                                      Sds,

                                      • At 2009.06.04 08:42, Alan Alencar da Silva said:

                                        Bom dia Caio

                                        Efetuei a validação, e ocorreu o seguinte erro:

                                        Resultado da Validação do Schema e Conferência da Assinatura:

                                        Value cannot be null. Parameter name: value

                                        Tipo: #whitespace
                                        Schema: Falha no schema xml. Access to the path ‘C:\DEC\Schemas\Dados\NFE’ is denied.
                                        Assinatura: Assinatura inválida

                                        Grato

                                        ASilva

                                        • At 2009.06.04 13:20, admin said:

                                          Olá Alan,

                                          Repare que vc. não pode declarar o schema como ‘C:\DEC\…’. O “validador” não vai conseguir encontrar essa pasta porque ela somente existe na sua instalação.

                                          Para declarar o “schemalocation” use um código como abaixo:

                                          //My_NFE.SetAttributeNS('xmlns:xsi-schemalocation', 'http://www.portalfiscal.inf.br/nfe', 'http://www.portalfiscal.inf.br/nfe/nfe_v1.10'.xsd');

                                          Ou seja, assim, vc vai estar declarando a localização publica do schema, a qual pode ser acessada independente de onde seu arquivo seja analisado.

                                          Sds, Caio

                                          • At 2009.07.16 10:23, Maickel said:

                                            tenho um problema, estou criando xml de CT-e (conhecimento de transporte):
                                            Active := True;
                                            Version := ’1.0′;
                                            Encoding := ‘UTF-8′;
                                            AddChild(‘CTe’);
                                            DocumentElement.Attributes['xmlns'] := ‘http://www.portalfiscal.inf.br/cte’;
                                            // A – Dados da CT-e
                                            NivelA := DocumentElement;
                                            // Adiciona a Tag
                                            NivelA.AddChild(‘infCte’);
                                            // Adiciona atributo “versao” da Tag anterior
                                            NivelA.ChildNodes['infCte'].Attributes['versao'] := dados.versao;
                                            // Adiciona atributo “Id” da Tag anterior
                                            NivelA.ChildNodes['infCte'].Attributes['Id'] := dados.id;

                                            o problema é que o XML sai da seguinte forma:

                                            0 …
                                            note que ele gera o atributo xmlns na tag CTe, tambem dentro do infCte. qual seria a solução?
                                            obrigado. e parabéns pelo exemplo, e facil e funcional

                                            • At 2009.07.18 12:15, Kleber said:

                                              Olá Caio aqui estou mais uma vez pra te encomondar, na verdade eu preciso ler o XML da NF-e, até aí tudo bem consigo numa boa, mas quando entra na TAG imposto enão consigo ler a terceira da tag por EX:
                                              NodeNivel6 := NodeNivel5.ChildNodes['imposto'];
                                              NodeNivel7 := NodeNivel6.ChildNodes['ICMS'];
                                              NodeNivel8 := NodeNivel7.ChildNodes['ICMS00'];

                                              cdsItens.FieldByNam(‘orig’).AsString := NodeNivel7.ChildNodes['orig'].text;
                                              cdsItens.FieldByName(‘CST’).AsString := NodeNivel7.ChildNodes['CST'].text;
                                              cdsItens.FieldByName(‘modBC’).AsString := NodeNivel7.ChildNodes['modBC'].text;
                                              cdsItens.FieldByName(‘vBC’).AsString := NodeNivel7.ChildNodes['vBC'].text;
                                              cdsItens.FieldByName(‘pICMS’).AsString := NodeNivel7.ChildNodes['pICMS'].text;
                                              cdsItens.FieldByName(‘vICMS’).AsString := NodeNivel7.ChildNodes['vICMS'].text;

                                              se for apenas duas tags fica numa boa como assim:
                                              NodeNivel25 := NodeNivel5.ChildNodes['imposto'];
                                              NodeNivel26 := NodeNivel25.ChildNodes['IPI'];

                                              cdsItens.FieldByName(‘clEnq’).AsString := NodeNivel26.ChildNodes['clEnq'].text;
                                              cdsItens.FieldByName(‘CNPJProd’).AsString := NodeNivel26.ChildNodes['CNPJProd'].text;
                                              cdsItens.FieldByName(‘cSelo’).AsString := NodeNivel26.ChildNodes['cSelo'].text;
                                              cdsItens.FieldByName(‘qSelo’).AsString := NodeNivel26.ChildNodes['qSelo'].text;
                                              cdsItens.FieldByName(‘cEnq’).AsString := NodeNivel26.ChildNodes['cEnq'].text;

                                              podes me ajudar ??

                                              Abraços

                                              • At 2009.08.27 20:38, Walter said:

                                                Olá caio Preciso de sua ajuda….

                                                Onde está o erro desse código?

                                                procedure TForm3.BitBtn1Click(Sender: TObject);
                                                var
                                                vXMLDoc: TXMLDocument;
                                                NodePrim,NodePai,NodeSec,NodeTmp: IXMLNode;
                                                nome, codigo: WideString;
                                                begin
                                                vXMLDoc := TXMLDocument.Create(self);

                                                // Le conteúdo do arquivo XML informado
                                                vXMLDoc.LoadFromFile(‘nfe.xml’);

                                                NodePrim := vXMLDoc.DocumentElement.ChildNodes.FindNode(‘NFe’);
                                                NodePai := NodePrim.ChildNodes.FindNode(‘infNFe’);
                                                NodeSec := NodePai.ChildNodes.FindNode(‘cobr’);

                                                NodeTmp := NodeSec.ChildNodes['dup'];
                                                NodeTmp.ChildNodes.First;

                                                repeat

                                                nome := NodeTmp.ChildNodes['nDup'].text;
                                                codigo := NodeTmp.ChildNodes['vDup'].text;

                                                if nome ” then
                                                begin
                                                memo1.Lines.Add( nome+’ —- ‘+codigo );

                                                end;

                                                NodeTmp := NodeTmp.NextSibling;
                                                NodeSec := NodeSec.NextSibling;

                                                until nome = ”

                                                end;

                                                • At 2009.08.28 09:43, admin said:

                                                  Olá Valter,

                                                  Experimenta assim:

                                                  procedure TForm3.BitBtn1Click(Sender: TObject);
                                                  var
                                                  vXMLDoc: TXMLDocument;
                                                  NodePrim,NodePai,NodeSec,NodeTmp: IXMLNode;
                                                  nome, codigo: WideString;
                                                  begin
                                                  vXMLDoc := TXMLDocument.Create(self);
                                                   
                                                  // Le conteúdo do arquivo XML informado
                                                  vXMLDoc.LoadFromFile(’nfe.xml);
                                                   
                                                   NodePai :=  vXMLDoc.DocumentElement.ChildNodes.FindNode('infNFe');
                                                   NodeSec := NodePai.ChildNodes.FindNode('cobr');
                                                   
                                                   NodeTmp := NodeSec.ChildNodes['dup'];
                                                   NodeTmp.ChildNodes.First;
                                                   
                                                   repeat
                                                   
                                                   nome := NodeTmp.ChildNodes['nDup'].text;
                                                   codigo := NodeTmp.ChildNodes['vDup'].text;
                                                   
                                                    if nome <> '' then
                                                    begin
                                                    memo1.Lines.Add( nome+' —- '+codigo );
                                                   
                                                    end;
                                                   
                                                    NodeTmp := NodeTmp.NextSibling;
                                                   
                                                    until NodeTmp = nil;
                                                  end;
                                                  • At 2009.08.28 09:48, admin said:

                                                    Repare que “NodePrim” que seria um referenciamento à tag Principal do XML não é instanciada.

                                                    No “repeat/until” fiz uma alteração importante:

                                                      repeat
                                                      ...
                                                      until nome = '';

                                                    para:

                                                      repeat
                                                      ...
                                                      until NodeTmp = nil;

                                                    Dessa forma vc evita que o codigo tente avaliar a expressão nome := NodeTmp…. para um node nulo o que causaria uma exceção.

                                                    Sds,

                                                    • At 2009.09.03 21:34, Flavio Verneque said:

                                                      estou usando o componente acbrnfepcn e quando retorna a transmissáo da nota da erro acess danied.
                                                      Que pode ser?

                                                      • At 2009.12.13 07:38, Werner dos Santos said:

                                                        Bom dia Caio…

                                                        Estou com um problema, leio o XML até o grupo de produtos, leio os itens, mas depois não leio mais nada, não da erro, de uma olhada no meu código…

                                                        // Dados do produto
                                                        Node_det := NodePai.ChildNodes['det'];
                                                        IdItem := Node_det.GetAttributeNS(‘nItem’,”) ;
                                                        Nodes_filhos_det := Node_det.ChildNodes.Count ;

                                                        NodeProd := Node_det.ChildNodes['prod'];
                                                        NodeProd.ChildNodes.First;
                                                        cTexto2 := ”;
                                                        repeat
                                                        PRO_OK := NodeProd.ChildNodes['cProd'].Text;
                                                        if Trim(PRO_OK) ” then
                                                        Begin
                                                        CODPRO := NodeProd.ChildNodes['cProd'].Text;
                                                        cTexto2 := cTexto2 +’-'+ CODPRO ;
                                                        cTexto := NodeProd.ChildNodes['cEAN'].Text;
                                                        cTexto := NodeProd.ChildNodes['xProd'].Text;
                                                        cTexto2 := cTexto2 +’-'+ cTexto ;
                                                        cTexto := NodeProd.ChildNodes['NCM'].Text;
                                                        CFOP := NodeProd.ChildNodes['CFOP'].Text;
                                                        cTexto3 := cTexto3 +’-'+ cTexto ;
                                                        UNID := NodeProd.ChildNodes['uCom'].Text;
                                                        QUANT := NodeProd.ChildNodes['qCom'].Text;
                                                        VALUNI := NodeProd.ChildNodes['vUnCom'].Text;
                                                        VALPROD := NodeProd.ChildNodes['vProd'].Text;
                                                        cTexto3 := cTexto3 +’-'+ cTexto ;
                                                        cTexto := NodeProd.ChildNodes['cEANTrib'].Text;
                                                        cTexto := NodeProd.ChildNodes['uTrib'].Text;
                                                        cTexto := NodeProd.ChildNodes['qTrib'].Text;
                                                        cTexto := NodeProd.ChildNodes['vUnTrib'].Text;
                                                        // Query

                                                        // Vou colocar os dados no memo apenas como exemplo
                                                        Memo2.lines.Add( ‘Gravando dados dos Itens …’);
                                                        Memo2.lines.Add( cTexto2 );
                                                        Memo2.lines.Add( cTexto3 );
                                                        End;
                                                        NodeProd := NodeProd.NextSibling ;
                                                        until NodeProd = nil ;
                                                        // Posiciono novamento
                                                        // Vou ler como arquivo texto

                                                        Node_Imposto := NodePai.ChildNodes['total'];
                                                        Node_Imposto.ChildNodes.First ;

                                                        Node_ICMS := Node_Imposto.ChildNodes['ICMStot'] ;
                                                        Node_ICMS.ChildNodes.First ;
                                                        cTexto := Node_Imposto.ChildNodes
                                                        ['vICMS'].Text;

                                                        NodeTrans := NodePai.ChildNodes['transp'];
                                                        NodeTrans.ChildNodes.First ;
                                                        // Transportadora
                                                        cTexto := NodeTrans.ChildNodes['CNPJ'].Text;
                                                        cTexto := NodeTrans.ChildNodes['xNome'].Text;
                                                        cTexto := NodeTrans.ChildNodes['IE'].Text;
                                                        cTexto := NodeTrans.ChildNodes['xEnder'].Text;
                                                        cTexto := NodeTrans.ChildNodes['xMun'].Text;
                                                        cTexto := NodeTrans.ChildNodes['UF'].Text;

                                                        // Veiculo
                                                        NodePlac := NodePai.ChildNodes['veicTransp'];
                                                        NodePlac.ChildNodes.First ;
                                                        cTexto := NodePlac.ChildNodes['veicTransp'].Text;
                                                        cTexto := NodePlac.ChildNodes['placa'].Text;
                                                        cTexto := NodePlac.ChildNodes['UF'].Text;
                                                        cTexto := NodePlac.ChildNodes['veicTransp'].Text;

                                                        // Cobrança
                                                        NoteCobr := NodePai.ChildNodes['dup'];
                                                        NoteCobr.ChildNodes.First ;
                                                        // NUMDOC := NoteCobr.ChildNodes['nDup'].Text;
                                                        cDatVenc := NoteCobr.ChildNodes['dVenc'].Text;
                                                        cTexto := NoteCobr.ChildNodes['vdup'].Text;
                                                        cDatVenc := NoteCobr.ChildNodes['dVenc'].Text;
                                                        cTexto := NoteCobr.ChildNodes['vDup'].Text;

                                                        • At 2009.12.14 09:50, admin said:

                                                          Olá Werner,

                                                          Use o codigo exemplo abaixo como modelo; o codigo abaixo faz o loop nos itens do documento e em seguida lê os totais. Repare que vc usa o “childnodes.first” apenas para elementos com ocorrência “1..N” (um para muitos).

                                                            //....
                                                            NodePai := vXMLDoc.DocumentElement.ChildNodes.FindNode('infNFe');
                                                           
                                                           // Dados do produto
                                                            Node_det := NodePai.ChildNodes.FindNode('det');
                                                            Node_det.ChildNodes.First;
                                                           
                                                            repeat
                                                                NodeProd  := Node_det.ChildNodes['prod'];
                                                                nome := NodeProd.ChildNodes['cProd'].text;
                                                                codigo := NodeProd.ChildNodes['xProd'].text;
                                                                if nome  '' then
                                                                begin
                                                                Memo2.Lines.Add('-----------------------------------------------');
                                                                Memo2.Lines.Add( nome+' ---- '+codigo );
                                                                end;
                                                                Node_det := Node_det.NextSibling;
                                                            until nome = '';
                                                           
                                                            NodeTmp := NodePai.ChildNodes.FindNode('total');
                                                            NodeTmp2:= NodeTmp.ChildNodes.FindNode('ICMSTot');
                                                           
                                                            Memo2.Lines.Add( NodeTmp2.ChildNodes['vBC'].Text );
                                                            Memo2.Lines.Add( NodeTmp2.ChildNodes['vICMS'].Text);
                                                            Memo2.Lines.Add( NodeTmp2.ChildNodes['vBCST'].Text);
                                                            Memo2.Lines.Add( NodeTmp2.ChildNodes['vST'].Text);
                                                            Memo2.Lines.Add( NodeTmp2.ChildNodes['vProd'].Text);
                                                            Memo2.Lines.Add( NodeTmp2.ChildNodes['vFrete'].Text);
                                                            //....

                                                          Sds,

                                                          • At 2011.01.09 18:48, Marcio said:

                                                            Ola amigo, blz? meus parabens pelo post.

                                                            Como eu adiciono a referencia do TXMLDocument no Delphi 7
                                                            Nao encontrei nada explicando como se faz?

                                                            obrigado

                                                            • At 2011.01.10 16:26, admin said:

                                                              Marcio,

                                                              Declare as units: xmldoc, XMLIntf e xmldom.

                                                              You must be logged in to post a comment.