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: , ,



28 Comentários to “Dados x XML, como começar?”

  1. Eremar | setembro 27th, 2008 at 12:40

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

    Obrigado pela dica.

  2. Marcos Jr | outubro 1st, 2008 at 9:31

    Ótima dica!

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

    Valeu

  3. Janete | outubro 5th, 2008 at 10:34

    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?

  4. Jeferson | outubro 10th, 2008 at 15:17

    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.

  5. Jeferson | outubro 10th, 2008 at 15:19

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

  6. Olimpio Rocha | outubro 10th, 2008 at 15:25

    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;

  7. Junior | outubro 15th, 2008 at 9:10

    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!

  8. Isa | outubro 16th, 2008 at 14:14

    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!

  9. Filipe | outubro 23rd, 2008 at 10:00

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

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

    Obrigado

  10. Filipe | outubro 24th, 2008 at 9:28

    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.

  11. Filipe | outubro 24th, 2008 at 9:50

    Oi.

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

    Vlw

  12. Nilton Cleverson de Oliveira | dezembro 10th, 2008 at 14:32

    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

  13. Wellington Costa | maio 12th, 2009 at 14:46

    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

  14. admin | maio 13th, 2009 at 11:00

    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,

  15. Alan Alencar da Silva | junho 2nd, 2009 at 14:50

    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.

  16. admin | junho 2nd, 2009 at 15:34

    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,

  17. Alan Alencar da Silva | junho 3rd, 2009 at 7:43

    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

  18. Caio | junho 3rd, 2009 at 10:15

    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,

  19. Alan Alencar da Silva | junho 4th, 2009 at 8:42

    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

  20. admin | junho 4th, 2009 at 13:20

    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

  21. Maickel | julho 16th, 2009 at 10:23

    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

  22. Kleber | julho 18th, 2009 at 12:15

    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

  23. Walter | agosto 27th, 2009 at 20:38

    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;

  24. admin | agosto 28th, 2009 at 9:43

    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;
  25. admin | agosto 28th, 2009 at 9:48

    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,

  26. Flavio Verneque | setembro 3rd, 2009 at 21:34

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

  27. Werner dos Santos | dezembro 13th, 2009 at 7:38

    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;

  28. admin | dezembro 14th, 2009 at 9:50

    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,

Faça um comentário