Ver Mensaje Individual
  #7  
Antiguo 19-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Reputación: 7
nincillo Va por buen camino
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
Responder Con Cita