Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer XML firmado por sri Ecuador (https://www.clubdelphi.com/foros/showthread.php?t=93868)

IVAND 13-04-2019 20:28:22

Leer XML firmado por sri Ecuador
 
Hola a todos

Estoy leyendo un XML firmado con el componente XMLDocument y esta bien todo pero no logro leer los nodos que estan mas adentro

Código:

<?xml version="1.0" encoding="UTF-8"?>

<autorizacion>

<estado>AUTORIZADO</estado>

<numeroAutorizacion>0307201600341817912561150018453454555</numeroAutorizacion>

<fechaAutorizacion>2016-07-03T00:34:18-05:00</fechaAutorizacion>

<ambiente>PRODUCCIÓN</ambiente>

<comprobante>
......
</comprobante>
</autorizacion>

Por ejemplo pude leer los que dicen estado y todos eso pero los que van dentro de el nodo comprobante ya no

Alguien me puede dar una luz que estoy haciendo mal


Código Delphi [-]
procedure TForm1.btn1Click(Sender: TObject);
var
  Autorizacion,Comprobante: IXMLNode;
begin
  XMLDocument1.FileName :='c:\xml_facturas\FA3110201801099270940500120010020000020240001395717.xml';
  XMLDocument1.Active := True;
  try
    Autorizacion := XMLDocument1.DocumentElement;
    Comprobante  := XMLDocument1.DocumentElement;

    edit.Text := Autorizacion.ChildNodes['estado'].Text;
    edit11.Text := Autorizacion.ChildNodes['numeroAutorizacion'].Text;
    edit12.Text := Autorizacion.ChildNodes['fechaAutorizacion'].Text;
    edit13.Text := Autorizacion.ChildNodes['ambiente'].Text;

    edit14.Text := Comprobante.ChildNodes['razonSocia'].Text;
    //txtModel.Text := Vehicle.ChildNodes['model'].Text;
    //txtnumber.Text  := Vehicle.ChildNodes['number'].Text;
  finally
    XMLDocument1.Active := False;
  end;
end;


Gracias a todos

bucanero 16-04-2019 10:00:25

Hola IVAND

prueba a asignar la variable comprobante como aparece mas abajo

Código Delphi [-]
  try
    Autorizacion := XMLDocument1.DocumentElement;
    Comprobante  := Autorizacion.ChildNodes['comprobante'];

    ...
    edit14.Text := Comprobante.ChildNodes['razonSocia'].Text;
    ...
  finally
    XMLDocument1.Active := False;
  end;

saludos

IVAND 17-04-2019 05:36:54

Gracias Bucanero , pero no lee la info :confused:

bucanero 17-04-2019 10:07:56

Cita:

Empezado por IVAND (Mensaje 531522)
pero no lee la info :confused:

Hola IVAND

Con esa información que das, no te puedo ayudar mucho... :confused: ¿Da error? si da error ¿que error es? ¿No lee nada?, ¿no hace ni dice nada? ...

A mi, en concreto y sobre este XML de ejemplo

Código:

<?xml version="1.0" encoding="UTF-8"?>
<autorizacion>
<estado>AUTORIZADO</estado>
<numeroAutorizacion>0307201600341817912561150018453454555</numeroAutorizacion>
<fechaAutorizacion>2016-07-03T00:34:18-05:00</fechaAutorizacion>
<ambiente>PRODUCCIÓN</ambiente>
<comprobante>
<razonSocial>rsocial</razonSocial>
<dato1>informacion1</dato1>
<dato2>info 2</dato2>
<dato3>info 3</dato3>
</comprobante>
</autorizacion>

y con este código, me lo lee sin problemas:
Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
  var
  Autorizacion,Comprobante: IXMLNode;
begin
  XMLDocument1.FileName := OpenDialog1.FileName;
  XMLDocument1.Active := True;
  try
    Autorizacion := XMLDocument1.DocumentElement;

    Memo1.Lines.add(Autorizacion.ChildNodes['estado'].Text);
    Memo1.Lines.add(Autorizacion.ChildNodes['numeroAutorizacion'].Text);
    Memo1.Lines.add(Autorizacion.ChildNodes['fechaAutorizacion'].Text);
    Memo1.Lines.add(Autorizacion.ChildNodes['ambiente'].Text);

    Comprobante  := Autorizacion.ChildNodes['comprobante'];
    Memo1.Lines.add(Comprobante.ChildNodes['razonSocial'].Text);
    Memo1.Lines.add(Comprobante.ChildNodes['dato1'].Text);
    Memo1.Lines.add(Comprobante.ChildNodes['dato2'].Text);
    Memo1.Lines.add(Comprobante.ChildNodes['dato3'].Text);
  finally
    XMLDocument1.Active := False;
  end;
end;

IVAND 18-04-2019 22:22:03

1 Archivos Adjunto(s)
Hola Bucanero

Gracias por responder , te comento que es la estructura , pero al ser un xml firmado por el sri de nuestro pais ya pone cosas raras , si eres tan amable te puedo enviar a tu correo el xml en cuestion , claro esta si tienes tiempo le echas una mirada

bucanero 22-04-2019 10:24:40

Hola IVAND

En tu ejemplo en particular, dentro del campo comprobante lo que va incluido es otro XML codificado, por lo tanto lo que debes de hacer es crear un segundo componente de tipo XMLDocument y asignarle el valor descodificado de ese XML.

Para descodificar puedes utilizar la funcion HTMLDecode de la unidad HTTPApp

Aquí te pongo un ejemplo:

Código Delphi [-]
uses HTTPApp;


function TForm2.LoadComprobante(const AXMLComprobante: String): Boolean;
var
  factura, InfoTributaria, InfoFactura: IXMLNode;
  NName:String;
begin
  Result := False;
  try
    // se asigna el contenido del XML
    XMLDocument2.XML.Text := AXMLComprobante;
    XMLDocument2.Active := True;
    try
      factura := XMLDocument2.DocumentElement;

      InfoTributaria := factura.ChildNodes['infoTributaria'];
      Memo1.Lines.add(InfoTributaria.ChildValues['tipoEmision']);
      Memo1.Lines.add(InfoTributaria.ChildValues['razonSocial']);
      Memo1.Lines.add(InfoTributaria.ChildValues['nombreComercial']);

      InfoFactura := factura.ChildNodes['InfoFactura'];

      // ....
      result := true;
    finally
      XMLDocument2.Active := False;
    end;
  except
    on E: Exception do
      MessageDlg(E.message, mtError, [mbOK], 0);
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Autorizacion: IXMLNode;
begin
  XMLDocument1.FileName := OpenDialog1.FileName;
  XMLDocument1.Active := True;
  try
    Autorizacion := XMLDocument1.DocumentElement;

    Memo1.Lines.add(Autorizacion.ChildNodes['estado'].Text);
    Memo1.Lines.add(Autorizacion.ChildNodes['numeroAutorizacion'].Text);
    Memo1.Lines.add(Autorizacion.ChildNodes['fechaAutorizacion'].Text);
    Memo1.Lines.add(Autorizacion.ChildNodes['ambiente'].Text);
    LoadComprobante(HTMLDecode(Autorizacion.ChildNodes['comprobante'].Text));
  finally
    XMLDocument1.Active := False;
  end;
end;

IVAND 25-05-2019 03:42:47

Muchas gracias por tu ayuda ,disculpa no haber contestado antes , tenia problemas para entrar al foro


La franja horaria es GMT +2. Ahora son las 04:58:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi