Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Como interpretar XML desde delphi 2007 (https://www.clubdelphi.com/foros/showthread.php?t=91966)

nincillo 13-06-2017 19:35:16

Como interpretar XML desde delphi 2007
 
Hola. Soy uno más de los que estoy a vueltas con lo del famoso SII.

Estoy con la verificación del CIF y el nombre de los clientes y proveedores.

Ya consigo hacer la petición y obtengo la respuesta en "bruto".

Ahora lo que me gustaría es poder tratarla "elegantemente" y de una forma de que luego me sirviera para ocasiones futuras cuando tenga que interpretar otras respuestas de este tipo JSON.

Yo las respuestas que consigo son:

Código:

<?xml version="1.0"?>
<env:Envelope xmlns:env="url" xmlns:xsd="url" xmlns:xsi="url">
  <env:Body>
    <VNifV1Sal:VNifV1Sal xmlns:VNifV1Sal="url">
    <VNifV1Sal:Nif>X11111111</VNifV1Sal:Nif>
    <VNifV1Sal:Nombre>ASTILLEROS GONDAN SA</VNifV1Sal:Nombre></VNifV1Sal:VNifV1Sal>
  </env:Body>
</env:Envelope>

O:

Código:

<?xml version="1.0"?>
<env:Envelope xmlns:env="url">
  <env:Body>
    <env:Fault>
      <faultcode>env:Client</faultcode>
      <faultstring>Codigo[-1].No identificado</faultstring>
    </env:Fault>
  </env:Body>
</env:Envelope>

Gracias y un saludo.

movorack 13-06-2017 20:55:53

¿JSON Donde?

Por otro lado... Si quieres dar soporte a JSON desde D2007 te recomiendo uses SuperObject

nincillo 13-06-2017 21:18:21

Cita:

Empezado por movorack (Mensaje 518152)
¿JSON Donde?

Y si no es json. ¿Qué se supone qué es? Y ¿con qué puedo interpretarlo?

¿Tengo que hacerlo a huevo buscando por contenido de cadena?

Perdona por lo verde que estoy.

jhonny 13-06-2017 22:12:15

Cita:

Empezado por nincillo (Mensaje 518153)
Y si no es json. ¿Qué se supone qué es? Y ¿con qué puedo interpretarlo?

¿Tengo que hacerlo a huevo buscando por contenido de cadena?

Perdona por lo verde que estoy.

Con el componente TXMLDocument podrías hacerlo ya que es claramente un documento XML en lugar de un JSON.

Aunque si esto lo obtienes a partir de un servicio como SOAP, podrías por ejemplo usar el WSDL Importer para que él mismo te haga lo necesario.

nincillo 14-06-2017 11:31:41

Cita:

Empezado por jhonny (Mensaje 518164)
Con el componente TXMLDocument podrías hacerlo ya que es claramente un documento XML en lugar de un JSON.

Aunque si esto lo obtienes a partir de un servicio como SOAP, podrías por ejemplo usar el WSDL Importer para que él mismo te haga lo necesario.

Gracias a tus consejos, me he decidido a intentar hacerlo con el WSDL Importer.

Creo que ya tengo la llamada para la petición de datos y la variable donde luego obtener al respuesta:

Código:

procedure TForm1.BtnEnvioSOAPClick(Sender: TObject);
var
  Ent : VNifV1Ent2;
  Sal : VNifV1Sal;
begin
  Ent := VNifV1Ent2.Create;
  Ent.Nif := 'xx';
  Ent.Nombre := 'xxx';

  sal := GetVNifV1(true,'',nil).VNifV1(Ent);

  sal.Free;
  ent.Free;
end;

El problema es que me salga un mensaje diciendo que necesito acceder con un certificado válido.

¿Podrías darme otro "empujoncito"?.

Muchas gracias de nuevo.

nincillo 14-06-2017 12:12:55

Lo siento, pero no puedo editar mi mensaje anterior...

Lo que quería decir es que me sale ese mensaje de error con respecto al certificado. (Estoy con Delphi 2007)

Otra posibilidad es que el XML de respuesta que si puedo conseguir de otra "manera" lo pueda meter en una variable de tipo VNifV1Sal para luego poder operar con ella.

nincillo 19-06-2017 10:34:06

Misterio con FindNode en Delphi 2007 ¿Bug?
 
Hola. Esto a vueltas con el famoso SII y con la verificación de los datos fiscales de los clientes y proveedores.

Para ello hago uso del webservice: https://www1.agenciatributaria.gob.e.../ws/VNifV2SOAP

El caso es que envío la petición sin problema y recibo la respuesta también correctamente.

El problema lo tengo cuando intento interpretar la respuesta:

Código:

<?xml version="1.0"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Body>
    <VNifV2Sal:VNifV2Sal xmlns:VNifV2Sal="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Sal.xsd">
      <VNifV2Sal:Contribuyente>
        <VNifV2Sal:Nif>99999999R</VNifV2Sal:Nif>
        <VNifV2Sal:Nombre>ESPA/OL ESPA/OL JUAN</VNifV2Sal:Nombre>
        <VNifV2Sal:Resultado>NO IDENTIFICADO</VNifV2Sal:Resultado>
      </VNifV2Sal:Contribuyente>
    </VNifV2Sal:VNifV2Sal>
  </env:Body>
</env:Envelope>

El código fuente que utilizo para interpretar la respuesta:

Código:

procedure TForm1.BtnTratarXMLVariosClick(Sender: TObject);
var
  lDocument : IXMLDocument;
  lNode, lNode2, lNode3, lNode4 : IXMLNode;
  i, j: integer;
begin
  MemoResultadoVarios.Lines.Clear;
  // Cargo el resultado obtenido en un documento xml para luego recorrerlo
  lDocument := TXMLDocument.Create(nil);
  lDocument.LoadFromXML(UTF8Encode(MemoResVarios.Text));
  // Me posiciono en el nodo que realmente tiene los datos que necesito.
  lnode := lDocument.ChildNodes.FindNode('env:Envelope');
  if lnode <> nil then
    begin
      if RecursiveFindNodeValue(lnode, 'faultstring') <> '' then
          begin
            MemoResultadoVarios.Lines.add('Error: ' + RecursiveFindNodeValue(lnode, 'faultstring'));
          end
        else
          begin
            // Localizo el nodo con el cuerpo del mensaje xml
            LNode2 := lNode.ChildNodes.FindNode('env:Body');
            // Me recorro todos los nodos hijos
            for j := 0 to lNode2.ChildNodes.Count - 1 do
              begin
                // Aguí voy poniendo en el memo los nombres que voy encontrando...
                MemoResultadoVarios.Lines.add(lNode2.ChildNodes[j].NodeName);
                // Y si algún nodo se llama como el que yo estoy buscanco,
                //se supone que estoy en el sitio que debo y buscando el nombre de nodo correcto
                If lNode2.ChildNodes[j].NodeName = 'VNifV2Sal:VNifV2Sal' then
                  begin
                    // Añado al log que lo encontré
                    MemoResultadoVarios.Lines.add('Entré en el if');
                    // Ahora intento hacer la misma búsqueda con el FindNode
                    LNode3 := lNode2.ChildNodes.FindNode('VNifV2Sal:VNifV2Sal');
                    // Y si no lo encuentro, entonces lo añado tambien al log
                    if not Assigned(lNode3) then MemoResultadoVarios.Lines.add('lNode3 no asignado nulo');
                  end;
              end;
          end;
    end;
end;


Y el log que obtengo:

Código:

VNifV2Sal:VNifV2Sal
Entré en el if
lNode3 no asignado nulo

¿Qué estoy haciendo mal?

Algo similar me está pasando cuando intento interpretar las respuesta cada vez que envío las facturas al SII.

https://www.clubdelphi.com/foros/sho...7&postcount=29

Casimiro Notevi 19-06-2017 10:58:55

He unido ambos temas, porque vienen a ser lo mismo.
Y no crees hilos repetidos, gracias ^\||/

nincillo 19-06-2017 11:06:23

Cita:

Empezado por Casimiro Notevi (Mensaje 518360)
He unido ambos temas, porque vienen a ser lo mismo.
Y no crees hilos repetidos, gracias ^\||/

Muchas gracias.

Casimiro Notevi 19-06-2017 11:29:48

Cita:

Empezado por nincillo (Mensaje 518361)
Muchas gracias.

Gracias a ti, por tu colaboración :)

nincillo 26-06-2017 20:41:33

YA encontré el misterio con el FindNode
 
Pues eso, que ya encontré porque no me funcionaba el FindNode.

Por lo visto, para que funcione correctamente, todas las "ramas" del árbol tienen que empezar igual. Y para mi desgracia, los xml de respuesta que nos manda la AEAT no todos empiezan igual. Véase:
Código:

<siiLRRC:IDFactura>
          <sii:IDEmisorFactura>
            <sii:NIF>10855497A</sii:NIF>
          </sii:IDEmisorFactura>
          <sii:NumSerieFacturaEmisor>A-451245B</sii:NumSerieFacturaEmisor>
          <sii:FechaExpedicionFacturaEmisor>01-01-2017</sii:FechaExpedicionFacturaEmisor>
        </siiLRRC:IDFactura>

Para que el FindNode funcione correctamente en este caso tiene que ir con un segundo parámetro con el valor ''.

Código:

lNode4 := lNodeRegFactura.ChildNodes.FindNode('siiLRRC:IDFactura', '')

nincillo 26-06-2017 20:43:14

Aprovechando que he vuelto a revivir el hilo...

¿Alguien podría decirme si existe un FindNode "recursivo". Vamos que busque no solo en los nodos de primer nivel.

Gracias y un saludo.


La franja horaria es GMT +2. Ahora son las 03:36:55.

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