Como faço para ler essas tags do xml ?
<deducoes> <deducao codigo="CSLL">32.13</deducao> <deducao codigo="IRRF">48.20</deducao> <deducao codigo="COFINS">96.39</deducao> <deducao codigo="PIS">20.88</deducao> </deducoes>
preciso ler essas tags porém não estou conseguindo segue a forma de leitura :
VIr := copy(ArquivoXML.Text,Pos('<deducao codigo="IRRF">', ArquivoXML.Text)+4, Pos('<deducao codigo="IRRF">', ArquivoXML.Text)-Pos('<deducao codigo="IRRF">', ArquivoXML.Text)+4);
Rodrigo Oliveira
Curtidas 0
Respostas
Romario Kilian
08/08/2017
Não seria o seguinte ??
VIr := copy(ArquivoXML.Text,Pos(''<deducao codigo="IRRF">'', ArquivoXML.Text)+5 <---- tamanho =5 devido ao ponto decimal ??
Pos(''<deducao codigo="IRRF">'', ArquivoXML.Text)-Pos(''<deducao codigo="IRRF">'', ArquivoXML.Text)+5);
e na ultima expressão acho que seria -Pos(''/dedução ao invés de <dedução).
Se falei bobagem ignore..
VIr := copy(ArquivoXML.Text,Pos(''<deducao codigo="IRRF">'', ArquivoXML.Text)+5 <---- tamanho =5 devido ao ponto decimal ??
Pos(''<deducao codigo="IRRF">'', ArquivoXML.Text)-Pos(''<deducao codigo="IRRF">'', ArquivoXML.Text)+5);
e na ultima expressão acho que seria -Pos(''/dedução ao invés de <dedução).
Se falei bobagem ignore..
GOSTEI 0
Rodrigo Oliveira
08/08/2017
Não é isso não amigo mas obrigado pela ajuda !
GOSTEI 0
Natanael Ferreira
08/08/2017
O que é ArquivoXML no seu código?
Vamos supor que você tenha estas tags em um memo chamado ArquivoXML.
O código para buscar o valor do IRRF ficaria assim:
Vamos supor que você tenha estas tags em um memo chamado ArquivoXML.
O código para buscar o valor do IRRF ficaria assim:
var VIr: string; I, inicio, fim: Integer; begin for I := 0 to ArquivoXML.Lines.Count do if pos('IRRF', ArquivoXML.Lines[I]) > 0 then begin inicio := pos('IRRF', ArquivoXML.Lines[I]) + 6; fim := pos('</deducao', ArquivoXML.Lines[I]); VIr := copy(ArquivoXML.Lines[I], inicio, fim - inicio); end; ShowMessage(VIr); end;
GOSTEI 0
Rodrigo Oliveira
08/08/2017
Está dando um erro undeclared indentifier lines
GOSTEI 0
Rodrigo Oliveira
08/08/2017
meu arquivoxml é uma stringlist
GOSTEI 0
Natanael Ferreira
08/08/2017
Se é StringList, tente adaptar este exemplo para seu código:
var VIr: string; I, inicio, fim: Integer; ArquivoXML: TStringList; begin ArquivoXML := TStringList.Create; try with ArquivoXML do begin Add('<deducoes>'); Add(' <deducao codigo="CSLL">32.13</deducao>'); Add(' <deducao codigo="IRRF">48.20</deducao>'); Add(' <deducao codigo="COFINS">96.39</deducao>'); Add(' <deducao codigo="PIS">20.88</deducao>'); Add('</deducoes>'); end; for I := 0 to ArquivoXML.Count - 1 do if pos('IRRF', ArquivoXML[I]) > 0 then begin inicio := pos('IRRF', ArquivoXML[I]) + 6; fim := pos('</deducao', ArquivoXML[I]); VIr := copy(ArquivoXML[I], inicio, fim - inicio); end; ShowMessage(VIr); finally FreeAndNil(ArquivoXML); end; end;
GOSTEI 0
Rodrigo Oliveira
08/08/2017
mas amigo esses valores podem ter 5 ou 4 posicoes como faço ?
GOSTEI 0
Natanael Ferreira
08/08/2017
Fiz algumas alterações para deixar o código mais genérico.
Testa aí:
Testa aí:
var VIr, VPis, VCsll, VCofins: string; I, inicio, fim: Integer; ArquivoXML: TStringList; begin ArquivoXML := TStringList.Create; try with ArquivoXML do begin Add('<deducoes>'); Add(' <deducao codigo="CSLL">11132.13</deducao>'); Add(' <deducao codigo="IRRF">11148.20</deducao>'); Add(' <deducao codigo="COFINS">1196.39</deducao>'); Add(' <deducao codigo="PIS">1120.88</deducao>'); Add('</deducoes>'); end; for I := 0 to ArquivoXML.Count - 1 do begin if pos('CSLL', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VCsll := copy(ArquivoXML[I], inicio, fim - inicio); end; if pos('IRRF', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VIr := copy(ArquivoXML[I], inicio, fim - inicio); end; if pos('COFINS', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VCofins := copy(ArquivoXML[I], inicio, fim - inicio); end; if pos('PIS', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VPis := copy(ArquivoXML[I], inicio, fim - inicio); end; end; ShowMessage('CSLL: ' + VCsll); ShowMessage('IRRF: ' + VIr); ShowMessage('COFINS: ' + VCofins); ShowMessage('PIS: ' + VPis); finally FreeAndNil(ArquivoXML); end; end;
GOSTEI 0
Rodrigo Oliveira
08/08/2017
muito obrigado amgo deu certo , mas gostaria de saber oque o codigo está fazendo poderia me explicar ?
GOSTEI 0
Natanael Ferreira
08/08/2017
Sim, claro. Estou postando o código novamente com explicações nos comentários.
Se restar dúvidas, pode perguntar novamente.
Se restar dúvidas, pode perguntar novamente.
var VIr, VPis, VCsll, VCofins: string; I, inicio, fim: Integer; ArquivoXML: TStringList; begin // Criando o Stringlist ArquivoXML := TStringList.Create; try // Populando o XML with ArquivoXML do begin Add('<deducoes>'); Add(' <deducao codigo="CSLL">11132.13</deducao>'); Add(' <deducao codigo="IRRF">11148.20</deducao>'); Add(' <deducao codigo="COFINS">1196.39</deducao>'); Add(' <deducao codigo="PIS">1120.88</deducao>'); Add('</deducoes>'); end; // Percorrendo o StringList linha a linha for I := 0 to ArquivoXML.Count - 1 do begin // Pos serve para tentar encontrar uma substring(CSLL, neste caso) na linha if pos('CSLL', ArquivoXML[I]) > 0 then begin // Pos novamente para encontrar o índice do início do valor inicio := pos('">', ArquivoXML[I]) + 2; // Pos novamente para encontrar o índice do fim do valor fim := pos('</deducao', ArquivoXML[I]); // Usamos o copy para copiar o valor utilizando os índices encontrados anteriormente VCsll := copy(ArquivoXML[I], inicio, fim - inicio); end; // As linha abaixo seguem o mesmo modelo if pos('IRRF', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VIr := copy(ArquivoXML[I], inicio, fim - inicio); end; if pos('COFINS', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VCofins := copy(ArquivoXML[I], inicio, fim - inicio); end; if pos('PIS', ArquivoXML[I]) > 0 then begin inicio := pos('">', ArquivoXML[I]) + 2; fim := pos('</deducao', ArquivoXML[I]); VPis := copy(ArquivoXML[I], inicio, fim - inicio); end; end; // Mostrando na tela os valores encontrados e armazenados nas variáveis ShowMessage('CSLL: ' + VCsll); ShowMessage('IRRF: ' + VIr); ShowMessage('COFINS: ' + VCofins); ShowMessage('PIS: ' + VPis); finally // Liberando o StringList da memória FreeAndNil(ArquivoXML); end; end;
GOSTEI 0