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