Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
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.

Última edición por Casimiro Notevi fecha: 19-06-2017 a las 11:20:32.
Responder Con Cita
  #2  
Antiguo 13-06-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
¿JSON Donde?

Por otro lado... Si quieres dar soporte a JSON desde D2007 te recomiendo uses SuperObject
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 13-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
¿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.
Responder Con Cita
  #4  
Antiguo 13-06-2017
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por nincillo Ver Mensaje
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 14-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
Cita:
Empezado por jhonny Ver Mensaje
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.
Responder Con Cita
  #6  
Antiguo 14-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 19-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 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
  #8  
Antiguo 19-06-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
He unido ambos temas, porque vienen a ser lo mismo.
Y no crees hilos repetidos, gracias
Responder Con Cita
  #9  
Antiguo 19-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
He unido ambos temas, porque vienen a ser lo mismo.
Y no crees hilos repetidos, gracias
Muchas gracias.
Responder Con Cita
  #10  
Antiguo 19-06-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por nincillo Ver Mensaje
Muchas gracias.
Gracias a ti, por tu colaboración
Responder Con Cita
  #11  
Antiguo 26-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
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', '')
Responder Con Cita
  #12  
Antiguo 26-06-2017
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Poder: 7
nincillo Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
crear un grafico en excel 2007 desde Delphi 2007 Jose Manuel Varios 1 27-12-2013 20:56:30
Como abrir una caja registradora desde delphi 2007 ingabraham Varios 5 04-01-2013 19:44:28
crear un trigger firebird desde delphi 2007 ingabraham Firebird e Interbase 4 03-01-2013 11:46:10
Hyperlink en Word desde Delphi 2007 Jose Manuel Servers 1 12-10-2011 16:28:34
Como interpretar WM_KEYDOWN casacham OOP 3 14-04-2009 10:32:00


La franja horaria es GMT +2. Ahora son las 23:55:58.


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
Copyright 1996-2007 Club Delphi