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