ler tag no delphi com TXMLDocument

Delphi

XML

10/03/2017

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...


<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>



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;



Desde já obrigado pela atenção.
Marcos Cunha

Marcos Cunha

Curtidas 0

Melhor post

Raylan Zibel

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

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;

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

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;
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

10/03/2017

Esqueci..
Depois de Pasta:=TListBox.Create(self);
Faça isso
Pasta.visible:=false;
GOSTEI 0
Marcos Cunha

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.
GOSTEI 0
Jean Teixeira

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.
GOSTEI 0
Raylan Zibel

Raylan Zibel

10/03/2017

GOSTEI 0
Marcos Cunha

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.
GOSTEI 0
POSTAR