ler tag no delphi com TXMLDocument
Bom dia amigos, sou iniciante em delphi, e estou desenvolvendo uma aplicação que necessita ler algumas tags em um xml, eu consigo carregar o arquivo e ler uma tag que é a "<ultNSU>", mas tem outra que eu preciso que é a "<chNFe>", e não consigo pegar os dados dela, será que alguém pode ajudar uma alma sofredora, kkk, o arquivo é o seguinte...
O código que eu uso é o seguinte...
Desde já obrigado pela atenção.
<retConsNFeDest xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<tpAmb>1</tpAmb>
<verAplic>1.1.1</verAplic>
<cStat>138</cStat>
<xMotivo>Documento localizado para o destinatario</xMotivo>
<dhResp>2017-03-06T17:54:28</dhResp>
<indCont>1</indCont>
<ultNSU>20531283364</ultNSU>
<ret>
<resNFe NSU="20531085938">
<chNFe>41170204634168000967550010001178731909897608</chNFe>
<CNPJ>04634168000967</CNPJ>
<xNome>DPS DISTRIBUIDORA DE PECAS SANTOS LTDA</xNome>
<IE>9060797126</IE>
<dEmi>2017-02-20</dEmi>
<tpNF>1</tpNF>
<vNF>1113.48</vNF>
<digVal>ferL25tdxQOhu+6cioBj+fguIS8=</digVal>
<dhRecbto>2017-02-20T18:01:38</dhRecbto>
<cSitNFe>1</cSitNFe>
<cSitConf>4</cSitConf>
</resNFe>
</ret>
</retConsNFeDest>
<tpAmb>1</tpAmb>
<verAplic>1.1.1</verAplic>
<cStat>138</cStat>
<xMotivo>Documento localizado para o destinatario</xMotivo>
<dhResp>2017-03-06T17:54:28</dhResp>
<indCont>1</indCont>
<ultNSU>20531283364</ultNSU>
<ret>
<resNFe NSU="20531085938">
<chNFe>41170204634168000967550010001178731909897608</chNFe>
<CNPJ>04634168000967</CNPJ>
<xNome>DPS DISTRIBUIDORA DE PECAS SANTOS LTDA</xNome>
<IE>9060797126</IE>
<dEmi>2017-02-20</dEmi>
<tpNF>1</tpNF>
<vNF>1113.48</vNF>
<digVal>ferL25tdxQOhu+6cioBj+fguIS8=</digVal>
<dhRecbto>2017-02-20T18:01:38</dhRecbto>
<cSitNFe>1</cSitNFe>
<cSitConf>4</cSitConf>
</resNFe>
</ret>
</retConsNFeDest>
O código que eu uso é o seguinte...
procedure TForm1.Button4Click(Sender: TObject);
var
vXMLDoc: TXMLDocument;
begin
vXMLDoc := TXMLDocument.Create(self);
Try
// abre o XML
vXMLDoc.LoadFromFile('D:\\'+data+'.xml');
// Le os dados contido nó principal
with vXMLDoc.DocumentElement do
begin
ultNSU := ChildNodes['ultNSU'].Text;
end;
Memo4.Clear;
Memo4.Lines.Add(ultNSU);
finally
VXMLDoc.Free;
end;
end;
var
vXMLDoc: TXMLDocument;
begin
vXMLDoc := TXMLDocument.Create(self);
Try
// abre o XML
vXMLDoc.LoadFromFile('D:\\'+data+'.xml');
// Le os dados contido nó principal
with vXMLDoc.DocumentElement do
begin
ultNSU := ChildNodes['ultNSU'].Text;
end;
Memo4.Clear;
Memo4.Lines.Add(ultNSU);
finally
VXMLDoc.Free;
end;
end;
Desde já obrigado pela atenção.
Marcos Cunha
Curtidas 0
Melhor post
Raylan Zibel
14/03/2017
Teste:
procedure TForm1.Button1Click(Sender: TObject); var _node1, _node2, _node3, _node4: IXMLNode; begin Memo1.Lines.Clear; XMLDocument1.LoadFromFile('nota.xml'); _node1 := XMLDocument1.ChildNodes.FindNode('retConsNFeDest'); if _node1 <> nil then begin Memo1.Lines.Add('-retConsNFeDest'); _node2 := _node1.ChildNodes.FindNode('ret'); if _node2 <> nil then begin Memo1.Lines.Add('--ret'); _node3 := _node2.ChildNodes.FindNode('resNFe'); if _node3 <> nil then begin Memo1.Lines.Add('---resNFe'); _node4 := _node3.ChildNodes.FindNode('chNFe'); if _node4 <> nil then begin Memo1.Lines.Add('----chNFe'); Memo1.Lines.Add(_node4.NodeValue); end; end; end; end; end;
GOSTEI 1
Mais Respostas
Raimundo Pereira
10/03/2017
Boa tarde.
Fiz algo interessante, uma busca de qualquer TAG do XML, veja se ajuda...
1. Declere as três funções.
private
{ Private declarations }
Function Subistituir_String(Conteudo,Conteudo_Procurado,Novo_Conteudo:string):string;
Function Load_XML(Caminho_XML:string):Boolean;
Function Localizar_String(Conteudo_Procurado:string):String;
Realizando sua consulta
Fiz algo interessante, uma busca de qualquer TAG do XML, veja se ajuda...
1. Declere as três funções.
private
{ Private declarations }
Function Subistituir_String(Conteudo,Conteudo_Procurado,Novo_Conteudo:string):string;
Function Load_XML(Caminho_XML:string):Boolean;
Function Localizar_String(Conteudo_Procurado:string):String;
implementation {$R *.dfm} Function TFP.Localizar_String(Conteudo_Procurado:string):String; var IProcura : Integer; begin Pasta.ItemIndex:=0; iProcura:=Pasta.Perform(LB_SELECTSTRING, 0, LongInt(PChar('<'+Conteudo_Procurado+'>'))); if iProcura >= 0 then begin Pasta.ItemIndex:=iProcura; Result:=(Pasta.Items.Strings[iprocura]); Result:=Subistituir_String(Result,'<'+Campo_para_leitura_XML+'>',''); Result:=Subistituir_String(Result,'</'+Campo_para_leitura_XML+'>',''); end; end; Function TFP.Load_XML(Caminho_XML:string):Boolean; begin Pasta:=TListBox.Create(self); Pasta.Parent:=FP; Pasta.Items.Clear; Pasta.Align:=alBottom; if not FileExists(Caminho_XML) then begin ShowMessage('Arquivo XML, não localizado em ['+Caminho_XML+']'); end else begin Pasta.Items.LoadFromFile(Caminho_XML); if Pasta.Items.Count=0 then begin ShowMessage('Nenhum registro encontrado'); end else begin Result:=true; end; end; end; Function TFP.Subistituir_String(Conteudo,Conteudo_Procurado,Novo_Conteudo:string):string; begin Result:=StringReplace(Conteudo, Conteudo_Procurado, Novo_Conteudo, [rfReplaceAll, rfIgnoreCase]); end;
Realizando sua consulta
procedure TFP.BTN_CarregarClick(Sender: TObject); begin if Load_XML('c:\\aplic\\Arquivo de Retorno.xml') = true then begin Campo_para_leitura_XML := 'chNFe'; // Campo que eu quero pesquisar ShowMessage(Localizar_String(Campo_para_leitura_XML)); end; end;
GOSTEI 0
Raimundo Pereira
10/03/2017
Não esqueça de declarar
Em Uses : Vcl.StdCtrls ou Vcl.StdCtrls
var
Pasta: TListBox;
Campo_para_leitura_XML: string;
Em Uses : Vcl.StdCtrls ou Vcl.StdCtrls
var
Pasta: TListBox;
Campo_para_leitura_XML: string;
GOSTEI 0
Raimundo Pereira
10/03/2017
Esqueci..
Depois de Pasta:=TListBox.Create(self);
Faça isso
Pasta.visible:=false;
Depois de Pasta:=TListBox.Create(self);
Faça isso
Pasta.visible:=false;
GOSTEI 0
Marcos Cunha
10/03/2017
Boa tarde, desculpe pela demora, mas eu fiz os testes agora, ele abre a mensagem normal, mas não retorna o valor que está dentro da tag.
Tá osso... kkkk
obrigado pela atenção.
Tá osso... kkkk
obrigado pela atenção.
GOSTEI 0
Jean Teixeira
10/03/2017
Brother gere a classe a partir do XSD diponibilizado pela sefz.
Logo aós isso faça o seguinte código :
function CarregarcteProc(const FileName: string): IXMLCteProcType;
begin
Result := LoadXMLDocument(FileName).GetDocBinding('cteProc', TXMLCteProcType, TargetNamespace) as IXMLCteProcType;
end;
A partir disso você tem um objeto do tipo IXMLCteProcType. Dessa forma voce pode pegar ou alterar qualquer valor a partir da interface.
Logo aós isso faça o seguinte código :
function CarregarcteProc(const FileName: string): IXMLCteProcType;
begin
Result := LoadXMLDocument(FileName).GetDocBinding('cteProc', TXMLCteProcType, TargetNamespace) as IXMLCteProcType;
end;
A partir disso você tem um objeto do tipo IXMLCteProcType. Dessa forma voce pode pegar ou alterar qualquer valor a partir da interface.
GOSTEI 0
Raylan Zibel
10/03/2017
GOSTEI 0
Marcos Cunha
10/03/2017
Caros amigos obrigadão pela atenção, com a resposta do Raylan eu consegui fazer, como não tenho experiencia com Delphi pra mim foi a melhor solução, agradeço muito pelo tempo disponibilizado por vocês para me ajudar nesse problema.
Apesar do meu pouco conhecimento sigo a disposição para qualquer coisa que possa ajudar.
Apesar do meu pouco conhecimento sigo a disposição para qualquer coisa que possa ajudar.
GOSTEI 0