Dados x XML, como começar?
Código-Fonte, Delphi julho 31st, 2008
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.
Desenvolvendo Aplicativos Personalizados padrão WEB 
















Meus parabens foi a primeira explicação do componente TXMLDocument que até agora funcionou certinho. simples e objetiva.
Obrigado pela dica.
Ótima dica!
eu procurei algo a respeito por horas e não encontrei nada tão pratico.
Valeu
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?
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.
Parabéns pela Dica. Muito valiosa, me ajudou muito…
Só falta os itens…
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;
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!
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!
Obrigado pela explicação.
O código está muito bem comentado.
Parabens pelo trabalho que você tem feito no site,.
Obrigado
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.
Oi.
Já resolvi o problema.
Pode desconsiderar o comentário anterior.
Vlw
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
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
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,
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.
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,
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
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,
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
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
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
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
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;
Olá Valter,
Experimenta assim:
Repare que “NodePrim” que seria um referenciamento à tag Principal do XML não é instanciada.
No “repeat/until” fiz uma alteração importante:
para:
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,
estou usando o componente acbrnfepcn e quando retorna a transmissáo da nota da erro acess danied.
Que pode ser?
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;
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).
Sds,