Mudanças entre as edições de "TPHXML"

(Exemplo)
Linha 1: Linha 1:
O objeto TPHXML permite a leitura de arquivo XML e a geração do XML, tornando possível a criação de XML's elaborados de acordo com a necessidade.
+
 
 +
A classe TPHXml foi projetada para manipulação de dados XML de forma simples e eficiente. Ela permite a leitura de XML, busca de elementos dentro de um XML, e fornece recursos para consumir arquivos XML.
  
 
===Propriedades===
 
===Propriedades===
 
{| class="wikitable" style="width: 100%"
 
{| class="wikitable" style="width: 100%"
 
! Nome  
 
! Nome  
!Tipo
+
! Tipo
!Descrição
+
! Descrição
 
|-
 
|-
|Arquivo
+
| Texto
|String
+
| String
|Conteúdo do XML.
+
| Armazena o texto contido em um elemento XML.
 
|}
 
|}
  
 
===Procedimentos===
 
===Procedimentos===
*'''NewPHXML''': Função que retorna o objeto criado;
+
*'''LerXml(Xml: String):''' Carrega um XML a partir de uma string fornecida.
*'''Free''': Libera o objeto da memória.
+
*'''Elemento(Index: Integer):''' Retorna o elemento na posição especificada pela lista de elementos.
*'''Executar:''' Realiza a leitura do conteúdo e carrega o objeto.
+
*'''ElementoDoNome(Nome: String):''' Busca um elemento pelo nome no XML carregado.
*'''ValorTag(Nivel: Integer; TagInicio: String; Item: String): String''': Retorna o conteúdo da tag e item.
+
*'''LoadFromFile(Arquivo: String):''' Carrega um arquivo XML do disco e processa com o método LerXml.
*'''GetTag(const NomeTag: string): string''': Retorna o conteúdo da Tag.
+
*'''Count:''' Retorna o número de elementos presentes na lista de elementos.
*'''AddOpenTag(const ATagName: string):''' Inicia uma Tag que não há valor e há Tags dentro da Tag Informada.
+
*'''RetornaXML:''' Retorna o XML armazenado na classe como uma string.
*'''AddTag(const ATagName, ATagValue: string):''' Adiciona uma nova tag com o nome e o valor informado.
+
 
*'''AddCloseTag:''' Realiza o fechamento da ultima Tag aberta </>.
+
===Exemplo(s)===
*'''GetXML:''' Retorna o XML construído em forma de texto.
 
  
===Exemplo===
+
Este exemplo mostra como utilizar a propriedade Count da classe TPHXml para iterar pelos elementos det de um XML e realizar ações específicas em cada produto. Além disso, a boa prática de criar objetos separados para os diferentes segmentos do XML (como ICMS e IPI) ajuda a otimizar a execução, isolando a lógica de cada parte do XML.
  
  // O exemplo de leitura de códigos de produtos de XML de NF-e
+
procedure ImportaXML;
  ArqXML := NewPHXML;
+
var
  try
+
  ArqXML, DETXML, DETICMSXML, DETIPIXML:TPHXML;                       
    ArqXML.Arquivo := XMLString; // String com o conteúdo XML
+
  I:Integer;                             
    ArqXML.Executar;
+
begin                                                                                                       
    while ArqXML.ValorTag(1, 'det', '', I + 1, 'cProd') <> EmptyStr do
+
  ArqXML := TPHXML.Create;
    begin
+
  try                                                                            
      V_CodProduto := ArqXML.ValorTag(1, 'det', '', I + 1, 'cProd');
+
    ArqXML.LerXML(ParamByName('Arquivo').AsString);
      I := I + 1;
+
         
     end;
+
    IniciarTransacao;                     
 +
    try                                                                                     
 +
      for I := 0 to ArqXML.ElementoDoNome('det').Count - 1 do                                                                                             
 +
      begin
 +
        DETXML := TPHXML.Create;
 +
        try
 +
          DETXML.LerXML(ArqXML.ElementoDoNome('det').Elemento(I).RetornaXML);
 +
           
 +
          { DET }
 +
          V_CodProduto := DETXML.ElementoDoNome('cProd').Texto;
 +
                   
 +
          { ICMS }                   
 +
          DETICMSXML := TPHXML.Create; 
 +
          try
 +
            DETICMSXML.LerXML(DETXML.ElementoDoNome('ICMS').RetornaXML);
 +
 +
            V_ICMSCST  := DETICMSXML.ElementoDoNome('CST').Texto;                                                                               
 +
          finally
 +
            DETICMSXML.Free;                                                                                                               
 +
          end;                       
 +
                                                       
 +
          { IPI }
 +
          DETIPIXML := TPHXML.Create;
 +
          try
 +
            DETIPIXML.LerXML(DETXML.ElementoDoNome('IPI').RetornaXML);                     
 +
             
 +
            V_IPIEnq := DETIPIXML.ElementoDoNome('cEnq').Texto;                                                             
 +
          finally
 +
            DETIPIXML.Free;                                                                                 
 +
          end;                    
 +
                                                                                                           
 +
          I := I + 1;
 +
 +
          ConfirmarTransacao;
 +
        finally
 +
          DETXML.Free;                                                     
 +
        end;                     
 +
      end;                 
 +
    except           
 +
      CancelarTransacao;
 +
      ErroValidacao(ExceptionMessage +' Produto: '+ V_CodProduto);                                       
 +
     end;                    
 
   finally
 
   finally
     ArqXML.Free;
+
     ArqXML.Free;                                      
   end;
+
   end;                 
 +
end;
  
  // O exemplo de gravação de XML
+
'''XML Base'''
  var XML:TPHXML;
+
<?xml version="1.0" encoding="UTF-8"?>
  begin
+
<notaFiscal>
    XML := NewPHXML;
+
  <det>
    try
+
    <cProd>12345</cProd>
      XML.AddTag('TagPrincipal');
+
    <xProd>Produto A</xProd>
      // Adiciona a seção de verificação
+
    <ICMS>
      XML.AddOpenTag('CampoID');
+
      <CST>00</CST>
      XML.AddTag('ID', 'ID');
+
      <vICMS>5.00</vICMS>
      XML.AddCloseTag;
+
    </ICMS>
      // Adiciona a seção de comando
+
    <IPI>
      XML.AddTag('Nome', 'Teste');
+
      <cEnq>999</cEnq>
      // Adiciona a seção de request
+
      <vIPI>2.50</vIPI>
      XML.AddOpenTag('SubItem');
+
    </IPI>
        // <SubItem> ....
+
  </det>
        XML.AddTag('Sequencia', '1');
+
  <det>
        XML.AddTag('Nome', 'Teste1');
+
    <cProd>67890</cProd>
        // </SubItem> ....
+
    <xProd>Produto B</xProd>
      XML.AddCloseTag;
+
    <ICMS>
     
+
      <CST>10</CST>
      Informacao(XML.GetXML);
+
      <vICMS>3.00</vICMS>
    finally
+
    </ICMS>
      XML.Free;
+
    <IPI>
    end;
+
      <cEnq>888</cEnq>
  end.
+
      <vIPI>1.50</vIPI>
 +
    </IPI>
 +
  </det>
 +
</notaFiscal>

Edição das 13h48min de 6 de março de 2025

A classe TPHXml foi projetada para manipulação de dados XML de forma simples e eficiente. Ela permite a leitura de XML, busca de elementos dentro de um XML, e fornece recursos para consumir arquivos XML.

Propriedades

Nome Tipo Descrição
Texto String Armazena o texto contido em um elemento XML.

Procedimentos

  • LerXml(Xml: String): Carrega um XML a partir de uma string fornecida.
  • Elemento(Index: Integer): Retorna o elemento na posição especificada pela lista de elementos.
  • ElementoDoNome(Nome: String): Busca um elemento pelo nome no XML carregado.
  • LoadFromFile(Arquivo: String): Carrega um arquivo XML do disco e processa com o método LerXml.
  • Count: Retorna o número de elementos presentes na lista de elementos.
  • RetornaXML: Retorna o XML armazenado na classe como uma string.

Exemplo(s)

Este exemplo mostra como utilizar a propriedade Count da classe TPHXml para iterar pelos elementos det de um XML e realizar ações específicas em cada produto. Além disso, a boa prática de criar objetos separados para os diferentes segmentos do XML (como ICMS e IPI) ajuda a otimizar a execução, isolando a lógica de cada parte do XML.

procedure ImportaXML;
var
  ArqXML, DETXML, DETICMSXML, DETIPIXML:TPHXML;                         
  I:Integer;                              
begin                                                                                                        
  ArqXML := TPHXML.Create;
  try                                                                              
    ArqXML.LerXML(ParamByName('Arquivo').AsString);
          
    IniciarTransacao;                      
    try                                                                                       
      for I := 0 to ArqXML.ElementoDoNome('det').Count - 1 do                                                                                              
      begin
        DETXML := TPHXML.Create;
        try
          DETXML.LerXML(ArqXML.ElementoDoNome('det').Elemento(I).RetornaXML);
            
          { DET }
          V_CodProduto := DETXML.ElementoDoNome('cProd').Texto;
                   
          { ICMS }                    
          DETICMSXML := TPHXML.Create;  
          try
            DETICMSXML.LerXML(DETXML.ElementoDoNome('ICMS').RetornaXML);

            V_ICMSCST   := DETICMSXML.ElementoDoNome('CST').Texto;                                                                                
          finally
            DETICMSXML.Free;                                                                                                                
          end;                        
                                                        
          { IPI }
          DETIPIXML := TPHXML.Create;
          try
           DETIPIXML.LerXML(DETXML.ElementoDoNome('IPI').RetornaXML);                      
             
           V_IPIEnq := DETIPIXML.ElementoDoNome('cEnq').Texto;                                                              
          finally
            DETIPIXML.Free;                                                                                  
          end;                      
                                                                                                            
          I := I + 1;

          ConfirmarTransacao;
        finally
          DETXML.Free;                                                      
        end;                      
      end;                  
    except            
     CancelarTransacao;
     ErroValidacao(ExceptionMessage +' Produto: '+ V_CodProduto);                                        
   end;                     
 finally
   ArqXML.Free;                                        
 end;                  
end;

XML Base

<?xml version="1.0" encoding="UTF-8"?>
<notaFiscal>
  <det>
    <cProd>12345</cProd>
    <xProd>Produto A</xProd>
    <ICMS>
      <CST>00</CST>
      <vICMS>5.00</vICMS>
    </ICMS>
    <IPI>
      <cEnq>999</cEnq>
      <vIPI>2.50</vIPI>
    </IPI>
  </det>
  <det>
    <cProd>67890</cProd>
    <xProd>Produto B</xProd>
    <ICMS>
      <CST>10</CST>
      <vICMS>3.00</vICMS>
    </ICMS>
    <IPI>
      <cEnq>888</cEnq>
      <vIPI>1.50</vIPI>
    </IPI>
  </det>
</notaFiscal>