Ayuda acerca de variable con un XML

Ayuda acerca de variable con un XML

Postby jose_murugosa » Wed Feb 22, 2017 10:31 am

Buenos días/tardes/noches:

Con mucha ayuda de los artículos del foro sobre webservices, he podido consumir los webservices de un software de terceros en la empresa que trabajo, hasta ahí, todo un éxito.

Lo hago así:

Code: Select all  Expand view

#include "fivewin.ch"

FUNCTION WSInac2 //Entrada Desosado
       LOCAL cXml, cErrorMsg, http, doc, cRespWS, cfecha

       cfecha := '20/02/2017'

       // objeto http
       try
             http:=createobject( "Microsoft.XMLHTTP")
       catch   
             try
                    http:=createobject( "Microsoft.XMLHTTP")
             catch
                    Alert("Error en la creacion del objeto Microsoft.XMLHTTP : " + Ole2TxtError())
                    return .F.
             end
       end

       //Objeto XML
       try
             doc := CreateObject( "MSXML2.DOMDocument" )
       catch
             try
                    doc := CreateObject( "MSXML2.DOMDocument" )
             catch
                    Alert("Error en la creacion del objeto MSXML2.DOMDocument : " + Ole2TxtError())
             end
             RETURN .F.
       end


       //XML con la consulta
       cXml:=''
       cXml+= '<?xml version="1.0" encoding="utf-8"?>' + CRLF
       cXml+= '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' + CRLF
       cXml+= '<soap:Body>' + CRLF
       cXml+= '<Desosado xmlns="http://gateway/inacapi/salidas">' + CRLF
       cXml+= '<Fecha>' + cfecha + '</Fecha>' + CRLF
       cXml+= '</Desosado>' + CRLF
       cXml+= '</soap:Body>' + CRLF
       cXml+= '</soap:Envelope>'
   
       http:Open( "POST" , "http://un_server_local/inacapi/salidas.asmx" , .F. )   //llamas al URL donde se aloja el servicio Web y usas el método que necesitas
       http:SetRequestHeader( "Content-Type" ,"text/xml; charset=utf-8")
       http:SetRequestHeader( "SOAPAction" , "http://gateway/inacapi/salidas/Desosado" ) //ejecutas acción
        http:SetRequestHeader( "Connection:", "Keep-Alive" )
        http:SetRequestHeader( "Content-length: ", Str( Len( cXml ) ) )

       doc:LoadXML( cXml ) // Carga el documento xml
       IF doc:parseError:errorCode = 0
             ?'Documento xml cargado sin problemas'
       ELSE
             cErrorMsg = "No fue posible cargar documento pues este no corresponde a su Schema"
             cErrorMsg = cErrorMsg + " Linea: " + STR(xmldom:parseError:line)
             cErrorMsg = cErrorMsg + " Caracter en linea: " + STR(xmldom:parseError:linepos)
             cErrorMsg = cErrorMsg + " Causa del error: " + xmldom:parseError:reason+" Codigo: "+STR(xmldom:parseError:errorCode)
             msginfo(cErrorMsg)
       ENDIF

       TRY
             http:send( doc:xml ) // Lo envio al WS
       CATCH
             cErrorMsg:="No Se Pudo Enviar Documento XML..."+ CRLF +"no fue posible conectar"
             MsgInfo(cErrorMsg,"Intente Nuevamente")
             return .f.
       END
   
       MsgInfo( "Xml Enviado!!" )
   
       cRespWS := http:responseText

           ? ( cRespWS )

RETURN NIL
 


Con esto obtengo en cRespWS la respuesta del servicio web que es otro xml

Necesito pasar ahora esta variable a una dbf, he visto que xharbour tiene la clase TXmlDocument() y hay bastante información de como levanar el archivo xml y convertirlo en lo que uno quiera... el tema es que este xml no es un archivo, está en memoria en esta variable.

LA PREGUNTA ES:
¿ Cómo convierto una variable que contiene un xml en una dbf o en su defecto como la convierto en un archivo xml en disco que luego pueda pasar a dbf con TXmlDocument() ?
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1173
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Ayuda acerca de variable con un XML

Postby Armando » Wed Feb 22, 2017 3:48 pm

José;

Tal vez digo una barrabasada, Que tal la función MEMOWRITE()

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3201
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Ayuda acerca de variable con un XML

Postby jose_murugosa » Wed Feb 22, 2017 3:53 pm

mmm.... curiosamente no se me ocurrió, probaré y te cuento :)
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1173
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Ayuda acerca de variable con un XML

Postby VitalJavier » Wed Feb 22, 2017 5:39 pm

Code: Select all  Expand view


FUNCTION FACTURA_CREA_FILE(cFileCrea,cCadenaCrea)   //Archivo con todo y Path,  Todo lo que va adentro
    LOCAL nMio := FCreate(cFileCrea,0)  
    FWrite(nMio,cCadenaCrea)
    FClose(nMio)
RETURN .T.

 


Con MEMOWRITE me pone un carácter al final
User avatar
VitalJavier
 
Posts: 239
Joined: Mon Jun 10, 2013 6:40 pm

Re: Ayuda acerca de variable con un XML

Postby jose_murugosa » Thu Feb 23, 2017 9:39 am

Hola, en primer lugar gracias a todos por la ayuda y el soporte de siempre, es un gran tesoro para los programadores.
Bueno, ambos métodos me han dado excelente resultado en guardar el archivo, pero me graban el xml como una sola línea de texto extremadamente larga...
Hay alguna clase o algo que permita convertir la variable que contiene el xml en un archivo xml con el formato correcto?

Gracias desde ya por vuestra ayuda e interés.
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1173
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Ayuda acerca de variable con un XML

Postby Carlos Mora » Thu Feb 23, 2017 11:44 am

VitalJavier wrote:
Code: Select all  Expand view


FUNCTION FACTURA_CREA_FILE(cFileCrea,cCadenaCrea)   //Archivo con todo y Path,  Todo lo que va adentro
    LOCAL nMio := FCreate(cFileCrea,0)  
    FWrite(nMio,cCadenaCrea)
    FClose(nMio)
RETURN .T.

 


Con MEMOWRITE me pone un carácter al final


En lugar de MemoWrite usa HB_MemoWrit(), no escribe el caracter EOF del final.

Cosillas del Harbour que no las pone por ningún lado y nos ahorra código... :)
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Ayuda acerca de variable con un XML

Postby Carlos Mora » Thu Feb 23, 2017 11:50 am

jose_murugosa wrote:Hola, en primer lugar gracias a todos por la ayuda y el soporte de siempre, es un gran tesoro para los programadores.
Bueno, ambos métodos me han dado excelente resultado en guardar el archivo, pero me graban el xml como una sola línea de texto extremadamente larga...
Hay alguna clase o algo que permita convertir la variable que contiene el xml en un archivo xml con el formato correcto?

Gracias desde ya por vuestra ayuda e interés.

Define "formato correcto". Porque si es una respuesta y el servicio funciona bien el resultado debe ser correcto. Creo que no estás dando suficientes pistas de que resultado quieres obtener, es dificil saber como darte ideas. Tienes un XML, ya lo escribes en un archivo, ¿Para que lo quieres ahí?

En un prinicpio lo querias transformar a dbf, por lo que si tienes un campo memo, haces directamente
Code: Select all  Expand view
Field->Memo := cRespWS

El memo soporta CRLF, EOF, etc. (si se usa FTP)
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Ayuda acerca de variable con un XML

Postby jose_murugosa » Thu Feb 23, 2017 2:30 pm

Carlos, gracias por tu comentario.
Yo opino igual, es la primera vez que trabajo con webservices y esperaba un xml perfecto, sin embargo el xml no tiene los CRLF, por lo que aparece como una tira larga de caracteres.
Veo los datos y están bien, pero el tema es que aparecen uno a continuación del otro sin los CRLF de cada línea ni indentaciones ni nada.
La verdad no me doy cuenta porque sucede esto.
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1173
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Ayuda acerca de variable con un XML

Postby jose_murugosa » Fri Mar 03, 2017 9:49 am

Bueno, había dejado este hilo sin cerrar....

Quisiera agradecer a todos los que me ayudaron y dieron sugerencias.

GRACIAS !!!!

Luego de agregar los CRLF faltantes del xml mediante Strtran( cxml, '><', ( '>'+CRLF+'<' ) ) todo anduvo sobre ruedas.

interesante función hb_memowrit :) .

El tema ha quedado resuelto no sin vuestra ayuda por cierto, gracias nuevamente por todo el tiempo que dedican a ayudar y enseñar. :D
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1173
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 41 guests