Estoy volviéndome loco con la interpretación de la respuesta tras el envío de las facturas.
La respuesta que recibo es:
Código:
<?xml version="1.0"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body Id="Body">
<siiR:RespuestaLRFacturasEmitidas xmlns:siiR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/RespuestaSuministro.xsd" xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">
<siiR:CSV>ExxxxxxX</siiR:CSV>
<siiR:DatosPresentacion>
<sii:NIFPresentador>xxxxxx</sii:NIFPresentador>
<sii:TimestampPresentacion>18-06-2017 10:15:56</sii:TimestampPresentacion>
</siiR:DatosPresentacion>
<siiR:Cabecera>
<sii:IDVersionSii>0.7</sii:IDVersionSii>
<sii:Titular>
<sii:NombreRazon>el nombre que sea</sii:NombreRazon>
<sii:NIF>xxxxxx</sii:NIF>
</sii:Titular>
<sii:TipoComunicacion>A0</sii:TipoComunicacion>
</siiR:Cabecera>
<siiR:EstadoEnvio>ParcialmenteCorrecto</siiR:EstadoEnvio>
<siiR:RespuestaLinea>
<siiR:IDFactura>
<sii:IDEmisorFactura>
<sii:NIF>xxxxxxx</sii:NIF>
</sii:IDEmisorFactura>
<sii:NumSerieFacturaEmisor>110896/F</sii:NumSerieFacturaEmisor>
<sii:FechaExpedicionFacturaEmisor>30/12/2011</sii:FechaExpedicionFacturaEmisor>
</siiR:IDFactura>
<siiR:EstadoRegistro>Correcto</siiR:EstadoRegistro>
</siiR:RespuestaLinea>
<siiR:IDFactura>
<sii:IDEmisorFactura>
<sii:NIF>xxxxxxx</sii:NIF>
</sii:IDEmisorFactura>
<sii:NumSerieFacturaEmisor>110899/F</sii:NumSerieFacturaEmisor>
<sii:FechaExpedicionFacturaEmisor>30/12/2011</sii:FechaExpedicionFacturaEmisor>
</siiR:IDFactura>
<siiR:EstadoRegistro>Incorrecto</siiR:EstadoRegistro>
<siiR:CodigoErrorRegistro>1100</siiR:CodigoErrorRegistro>
<siiR:DescripcionErrorRegistro>Valor o tipo incorrecto del campo: ImporteTotal</siiR:DescripcionErrorRegistro>
</siiR:RespuestaLinea>
</siiR:RespuestaLRFacturasEmitidas>
</env:Body>
</env:Envelope>
El problema lo tengo al intentar obtener el valor de: sii:NumSerieFacturaEmisor
El código que uso es:
Código:
lDocument := TXMLDocument.Create(nil);
lDocument.LoadFromXML(UTF8Encode(MemoRespuesta.Text));
// Me posiciono en el nodo que realmente tiene los datos que necesito.
lnode := lDocument.ChildNodes.FindNode('env:Envelope');
LNode2 := lNode.ChildNodes['env:Body'];
// Apunto al siguiente nodo que es donde está ya la chicha.
// No lo hize con FinNode('VNifV2Sal:VNifV2Sal') porque no funcionó de ninguna forma
LNode3 := lNode2.ChildNodes[0];
// Ahora recorro todos los nodos buscando los correspondientes a cada una de las facturas
for i := 0 to LNode3.ChildNodes.Count - 1 do
begin
If lnode3.ChildNodes[i].NodeName = 'siiR:RespuestaLinea' Then
begin
lNodeRespuestaLinea := lnode3.ChildNodes[i].CloneNode(true);
lNodeIDFactura := lNodeRespuestaLinea.ChildNodes['siiR:IDFactura'].CloneNode(true);
// Este si que lo encuentra por nombre !!!!
MemoInterpretado.Lines.add('=>'+lNodeRespuestaLinea.ChildValues['siiR:EstadoRegistro']);
// Mediante el número del nodo hijo si puedo acceder al valor
MemoInterpretado.Lines.add(lNodeIDFactura.ChildNodes[1].NodeName);
MemoInterpretado.Lines.add(lNodeIDFactura.ChildNodes[1].NodeValue);
// Por el nombre no funciona. Es como si no lo encontrara.
MemoInterpretado.Lines.add('Aquí ya no lo consigo: ' & lNodeIDFactura.ChildNodes['sii:NumSerieFacturaEmisor'].NodeValue);
end;
end;
El resultado que obtengo es:
Código:
Resultado Envío: ParcialmenteCorrecto
=>Correcto
sii:NumSerieFacturaEmisor
110896/F
Aquí ya no lo consigo:
Por las pruebas que he estado haciendo parece que si el nodo fuese: <siiR:NumSerieFacturaEmisor>110899/F</siiR:NumSerieFacturaEmisor> si que lo encontraría por el nombre.
¿Podrá tratarse de algún bug o algo de la librería que al haber nodos con sii y nodos con siiR se "lie"?
Las variables las estoy definiendo:
Código:
lDocument : IXMLDocument;
lNode, lNode2, lNode3, lNode4, lNodeRespuestaLinea, lNodeIDFactura : IXMLNode;
Un saludo.