Montando Arquivo XML x NF-e
Autor: delphizinho | Publicado: 2009-03-19T10:02:00-03:00

Para quem deseja começar a preparar o sistema da NF-e (Nota Fiscal Eletrônica), aqui vai uma dica muito interessante: como montar parte da estrutura XML.É importante lembrar que, a NF-e utiliza muito mais que isso. Não é só a estruturação do arquivo XML que é necessário, mas sim todo processo de validação dos dados, assinatura do arquivo, certificado etc.Mas aqui falaremos apenas sobre a estrutura inicial do XML.Neste exemplo a seguir será mostrado como: adicionar um nó; e como adicionar um nó como filho de outro nó.Breve explicação do que será feito:>> Vamos declarar uma variável do tipo IXmlNode, ela será chamada de "Root", e será usada por vários procedimentos.>> Criaremos três procedimentos: CabecalhoXML; Informacao1 e Informacao2.No CabecalhoXML é onde será criado todo o cabeçalho do arquivo XML.Em Informacao1 e Informacao2, é onde irá conter os dados que irá compor o arquivo.>> Criaremos uma função: CriaDirCaminho(const NomeSubDir: string): boolean;Essa função é para criar uma pasta (no nosso exemplo, será a pasta "TESTE") em um diretório qualquer informado (no nosso exemplo, será no diretório "H", mude para um de sua preferência).>>E adicionaremos um botão no formulário: nele será colocado informações de entrada e saída do arquivo XML.Eis o significado de alguns termos que será utilizado na codificação:XMLDocument1 -> é o componente do XML.IXmlNode -> é como se fosse o raiz, nele contém os nós filhos do XML.AddChild -> Adiciona um elemento filho à um nó XMLNodeValue -> Retorna o valor do nó do objeto XML.Resumindo: na verdade são árvores de nó em qual cada nó é um elemento.Iniciando o projeto:Abra o Delphi.Na aba INTERNET, adicione ao formulário um TXMLDocument.Adicione um botão, onde será armazenado o código.Vamos a codificação:Crie os três procedimentos: procedure CabecalhoXML; procedure Informacao1; procedure Informacao2;E uma função: CriaDirCaminho(const NomeSubDir: string): boolean;Declare a variável como global --->   Root : IXmlNode;Atenção aos códigos:Esse é o código da função para criar uma Pasta no diretório:function TForm1.CriaDirCaminho(const NomeSubDir: string): boolean;var Dir : string;beginDir := 'H:'+'\'+NomeSubDir;if not DirectoryExists(Dir) thenForceDirectories(Dir);end;Código do procedimento de CabecalhoXML:procedure TForm1.CabecalhoXML;var versao : real;id : integer;begin//Transformando "," em "."  (vírgula em ponto)DecimalSeparator := '.';//Preenchendo variáveis:id    := 12345;versao:= 1.00;XMLDocument1.Options := [doNodeAutoIndent];//Ativa XMLXMLDocument1.Active := True;//CabeçalhoXMLDocument1.Encoding := 'utf-8';XMLDocument1.Version  := '1.0';//Declara o Namespace (se houver)Root :=  XMLDocument1.addChild('Delphizinho','http://www.delphizinho.blogspot.com');//Identificação (se houver)Root := Root.AddChild('atributos');Root.Attributes['Id']     := id;Root.Attributes['versao'] := FormatFloat('0.00', versao);//Retornando "." para ","  (ponto para vírgula)DecimalSeparator := ',';end;Código do procedimento de Informacao1:procedure TForm1.Informacao1;begin//ROOT raiz de informacao1//AddChild -> Início do nó em informacao1with Root.AddChild('informacao1') do beginAddChild('nome').NodeValue := 'Carlos Felizberto Assis';AddChild('idade').NodeValue := '30';AddChild('sexo').NodeValue := 'Masculino'end; //fim de informacao1end;Código do procedimento de Informacao2:procedure TForm1.Informacao2;begin//ROOT raiz de informacao2//AddChild -> Início do nó em informacao2with Root.AddChild('informacao2') do beginAddChild('telefone').NodeValue := '(021)5555-5555';AddChild('celular').NodeValue := '(021)8888-8888';//AddChild -> Adiciona um nó como filho de outro nówith AddChild('endereco') do beginAddChild('rua').NodeValue := 'Rua da Felicidade';AddChild('numero').NodeValue := 's/n';AddChild('complemento').NodeValue := 'quadra 5000'end; //fim de enderecoAddChild('observacao').NodeValue := 'sem observacao';end; //fim de informacao2end;Código do procedimento do Botão:procedure TForm1.BitBtn1Click(Sender: TObject);var Nome_Arquivo, Caminho : string;beginXMLDocument1.Active := False;XMLDocument1.XML.Clear;//Cria pasta Teste1 no diretório H (caso não exista)CriaDirCaminho('Teste'); //função para criar a pasta Teste//Preenchendo variáveis:Nome_Arquivo := ''; //limpaNome_Arquivo := 'Teste1'; //Indica nome do arquivo XMLCaminho := '';  //limpaCaminho := 'H:\Teste';  //Indica caminho a ser gravado o XML//Chamada do Cabeçalho:CabecalhoXML;//Chamada de dados de Informacao1:Informacao1;//Chamada de dados de Informacao2:Informacao2;//Salva o arquivo XMLXMLDocument1.SaveToFile(Caminho+'\'+Nome_Arquivo+'.xml');ShowMessage('XML '+Nome_Arquivo+' gerada com sucesso na pasta '+Caminho);btSair.SetFocus;end;Depois de executado o código, o arquivo teste1.xml foi criado (conforme nosso exemplo) no caminho: "H:\Teste".Dê um duplo clique no arquivo, para visualizá-lo no navegador.Se for pelo navegador Firefox, basta clicar direto.Pronto, já está sendo exibido corretamente. Clique nas abas "-" para ocultar e na aba "+" para exibir as informações contidas em cada nó:Se for visualizar pelo navegador IE, faça:Serão necessários alguns ajustes, para ele exibir corretamente o XML. Clique na barra amarela:2- Controle ActiveX, é necessário executar, clique em "Permitir Conteúdo Bloqueado...":3- Nessa pergunta, responda "SIM":4- Pronto, já está sendo exibido corretamente. Clique nas abas "-" para ocultar e na aba "+" para exibir as informações contidas em cada nó:5- Exemplo de algumas informações ocultadas pelas abas:Fiz testes em alguns navegadores (Safari, Firefox, Chrome, IE), e constatei que o IE e o Firefox são os que o exibem corretamente (em forma identada (com as abas "-" e "+" de controle) e exibe conteúdo do código chamado em xml). Pois os outros mostram a informação direta (somente o resultado final).----------------------------------------------------------------------------------Na NF-e este exemplo (da parte do Cabeçalho) ficaria do seguinte modo:o Root:Root:=  XMLDocument1.addChild('NFe','http://www.portalfiscal.inf.br/nfe');Definição de Relações. Identificação da NF-e e Versão do Leiaute:Id:= 'NFe'+chaveNFe; //variável recebe palavra "NFe" + a chave.Root := Root.AddChild('infNFe');Root.Attributes['Id']     := id;Root.Attributes['versao'] := FormatFloat('0.00', versao);id -> é a chave da NF-e;versao-> é a versão do aplicativo (conforme o layout estabelece).Observe, que nesse exemplo, o nó "Delphizinho" é o geral, nele contém: nó "atributos";O nó "atributos" contém: nó "informacao1" e nó "informacao2";O nó "informacao2", contém: nó "endereco".Nos exemplos dos procedimentos Informacao1 e Informacao2, para aplicar à NF-e, é só substituir conforme o layout pede.Onde obter mais informação sobre XML:-> Site da W3C http://www.w3c.org/XML/************************************************Faça o download do arquivo: XML.rar************************************************"Uma viagem de mil léguas começoucom o primeiro passo." Lao Tsé.