FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Leer datos especifico de un XML
Posts: 18
Joined: Mon Jan 29, 2007 01:29 AM
Re:
Posted: Tue Oct 02, 2007 02:33 PM
thefull wrote:
MarioDava wrote:Ok Rafael, te comento, tambien estoy usando xHarbour 00.99.70, pero me puedes indicar el nombre de la librerái donde se encuentran estas clases.

Saludos,


thefull wrote:
MarioDava wrote:Thefull, de hecho si vi tus articulos, e hice las pruebas pero no me funciono, primero no supe cual era la libreria o si era un prg con la clase, que include se necesitaba, etc.

De hecho tampoco me funciono la clase XMLRead, así que me ire con las sugerencia de Miguel.

Pero agradezco la atención.

Saludos,

Pues la libreria TIP creo que es la que contiene el tema de internet, XML, etc.
De todas maneras, tienes que poner el #include "hbxml.ch"m, ademas
de compilar con la libreria pcrepos, soporte de expresiones regulares,
pero no estoy seguro de ello, puesto que pueden que hayan cambiado
alguna parte de xHarbour que no se comporte como deberia...

Me parece una burrada el codigo que habeis puesto, pues es inmantenible a la larga, solamente sirve para salir del paso , pero no para abordar el problema.

La solucion mucho más potente , en todos los sentidos, es usar las clases
de Giancarlo, que realizó para xHarbour, ahora estan tambien pasandolas a Harbour.

Te voy a poner un ejemplo practico, para que puedes ver realmente como funciona;

Ejemplo:
#include "fileio.ch"
#include "hbxml.ch"

PROCEDURE Main( cFileName )

    hFile := FOpen( cFileName )
  
    If hFile = -1
       Error_Msg( cFileName, "No se pudo abrir el fichero" + cFileName )
       return 
    endif

    oXmlDoc := TXmlDocument():New( hFile )

    if oXmlDoc:nStatus != HBXML_STATUS_OK  
       cError := "Error While Processing File: " + AllTrim( Str( oxmlDoc:nLine ) ) + " # "+;
                 "Error: " + HB_XmlErrorDesc( oxmlDoc:nError ) + " # " +;
                 "Tag Error on tag: " + oxmlDoc:oErrorNode:cName + " # " +;
                 "Tag Begin on line: " + AllTrim( Str( oxmlDoc:oErrorNode:nBeginLine ) ) 
       Error_Msg( cFileName, cError )
       QUIT
    endif

     if( oNodo := oXmlDoc:FindFirst( "PETICION", "id",  "CONSULTA_EMPRESA" ) ) != NIL )
       Consulta_Empresa( oNodo, cFileName )
     endif

   fClose( hFile )
   
RETURN

*******************************************************************************
*******************************************************************************
STATIC FUNCTION Consulta_Empresa( oNodo, cFile )
    Local oIter, oNodeChild , oNode, oIterDia, oNodeDia, oNodeDet
    Local oNodeHab  
    Local nCodigo , cNombre
    Local oDoc, oRes, oNode_Empresa, oUnidad, oDbf
    Local cPath, cFileName

    If !open( "AGENCIAS" )
       Error_Msg( cFile, "NO SE PUDO ABRIR AGENCIAS", "CONSULTA_EMPRESA" )
       Return NIL
    Endif
    DATABASE oDbf
    oDbf:SetBuffer( .F. )
   
     // Buscando codigo
    oIter    := TXMLIteratorScan():New( oNodo )
    oNode    := oIter:Find( "PARAM", "id", "codigo" )
    nCodigo := oNode:GetAttribute("valor")
    
    oNode    := oNode:oNext // El siguiente en el nodo es el nombre
    //cNombre  := oNode:GetAttribute("valor")
    cNombre  := oNode:cData // Para VALORES CDATA

    oDoc := TXmlDocument():New() // Creacion del documento respuesta....
    oDoc:AddBelow( TxmlNode():New( HBXML_TYPE_PI,'xml' , , 'version="1.0" encoding="iso-8859-1"' ) )
    oRes := TxmlNode():New( HBXML_TYPE_TAG, "RESPUESTA" )
    oRes:SetAttribute( "id", "CONSULTA_EMPRESA" )
    oRes:SetAttribute( "res", "OK" )
    oDoc:AddBelow( oRes )
    
    oNode_Empresa := TxmlNode():New( HBXML_TYPE_TAG, "LEMPRESAS" )

    IF !Empty( nCodigo ) // Pasamos codigo, buscamos por codigo
        nCodigo = VAL( nCodigo )
        IF DbSeek( nCodigo )
           oUnidad := SAVEAGE2XML( oDbf )
           oNode_Empresa:AddBelow( oUnidad )
        ENDIF 
    ELSE  // El codigo esta vacio, buscamos por nombre
       IF !Empty( cNombre )
          oDbf:SetOrder( 2 ) 
          IF DbSeek( cNombre )
             While !oDbf:Eof()
                 IF cNombre = Substr( oDbf:Ag_Nom, 1, Len( cNombre ) )
                    oUnidad := SAVEAGE2XML( oDbf )
                    oNode_Empresa:AddBelow( oUnidad )
                 ELSE
                    EXIT
                 ENDIF   
                 oDbf:Skip()   
                 SysRefresh()
             end while
           ENDIF     
       ENDIF        
    ENDIF

    oDbf:Close()

    *oDoc:AddBelow( oNode_Empresa )
    oRes:AddBelow( oNode_Empresa )
    
    cPath := cFilePath( cFile )
    if cPath == ""
       cPath := ""
    endif
    cFileName := Name_File( cFile )
    hFile := FCreate( cPath + cFileName + ".RES" )
    
    If hFile != -1
       oDoc:Write( hFile, HBXML_STYLE_INDENT + HBXML_STYLE_THREESPACES )
       FClose( hFile )
    Endif
    
    SysRefresh()

RETURN NIL

*******************************************************************************
*******************************************************************************
STATIC FUNCTION SAVEAGE2XML( oDbf )
   Local oNodo, oNombre, oDirec, oCData, oPobla, oPais, oProv, oCodigo

   oNodo := TxmlNode():New( HBXML_TYPE_TAG, "EMPRESA" )

   oCodigo := TxmlNode():New( HBXML_TYPE_TAG, "PARAM" )
   oCodigo:SetAttribute( "id", "codigo" )
   oCodigo:SetAttribute( "valor", alltrim( str( oDbf:Ag_Codi ) ) )
   oNodo:AddBelow( oCodigo )
    // Metemos Codigo.
   *oNodo:AddBelow( TxmlNode():New( HBXML_TYPE_TAG, "codigo", , alltrim( str( oDbf:Ag_Codi ) ) ) )
            
   // Nombre
   oNombre := TxmlNode():New( HBXML_TYPE_TAG, "PARAM" )
   oNombre:SetAttribute( "id", "nombre" )
   // Atencion.. si activamos esta linea, crearia <nombre>[[CDATA]]</nombre>
   // oNombre := TxmlNode():New( HBXML_TYPE_TAG, "nombre" )
     oCData := TxmlNode():New( HBXML_TYPE_CDATA )
     oCData:cData := OemToAnsi( Alltrim( oDbf:Ag_Nom ) )
   oNombre:AddBelow( oCData )
   oNodo:AddBelow( oNombre )
          
   // Direccion
   oDirec := TxmlNode():New( HBXML_TYPE_TAG, "PARAM" )
   oDirec:SetAttribute( "id", "direccion" )
     oCData := TxmlNode():New( HBXML_TYPE_CDATA )
     oCData:cData := OemToAnsi( Alltrim( oDbf:Ag_direcci ) )
   oDirec:AddBelow( oCData )
   oNodo:AddBelow( oDirec )
           
   // Poblacion
   oPobla := TxmlNode():New( HBXML_TYPE_TAG, "PARAM" )
   oPobla:SetAttribute( "id", "poblacion" )
     oCData := TxmlNode():New( HBXML_TYPE_CDATA )
     oCData:cData := OemToAnsi( Alltrim( oDbf:Ag_poblaci ) )
   oPobla:AddBelow( oCData )
   oNodo:AddBelow( oPobla )
           
   // Provincia
   oProv := TxmlNode():New( HBXML_TYPE_TAG, "PARAM" )
   oProv:SetAttribute( "id","provincia" )
     oCData := TxmlNode():New( HBXML_TYPE_CDATA )
     oCData:cData := OemToAnsi( Alltrim( oDbf:Ag_PoblaC2 ) )
   oProv:AddBelow( oCData )
   oNodo:AddBelow( oProv )
           
   // Pais
    oPais := TxmlNode():New( HBXML_TYPE_TAG, "PARAM" )
    oPais:SetAttribute( "id","pais" )
     oCData := TxmlNode():New( HBXML_TYPE_CDATA )
     oCData:cData := OemToAnsi( Alltrim( oDbf:Ag_Pais ) )
   oPais:AddBelow( oCData )
   oNodo:AddBelow( oPais )

RETURN oNodo


Para entenderlo , te pongo la definicion del XML, con su explicacion, para
que puedas hacerte una idea.

******************************************************************************
PETICION DE CONSULTA PARA EMPRESAS
******************************************************************************

"codigo"
Si el valor de codigo es diferente que vacio, devolverá en la respuesta
solamente la empresa/agencia de ese codigo.

"nombre"
Si se da nombre, y el valor de codigo esta vacio, devolverá una lista
conteniendo los registros que cumplan solamente el contenido inicial del
nombre, es decir, si el valor es "EL CORTE", se seleccionaran TODOS los que
empiezan por "EL CORTE".


<?xml version="1.0" encoding="iso-8859-1"?>
<PETICION id="CONSULTA_EMPRESA">
<LPARAMS>
<PARAM id="codigo" valor="xxx"/>
<PARAM id="nombre"> <![CDATA[A & B]]> </PARAM>
</LPARAMS>


******************************************************************************
RESPUESTA PARA CONSULTA DE EMPRESA
******************************************************************************
El fichero generado sera igual al que hemos pasado , pero con la extension
.RES. El fichero resultante se creará donde este el fichero pasado.

El contenido de [[CDATA]] se establece para que el parseador de XML no tenga
en cuenta el contenido.

<?xml version="1.0" encoding="iso-8859-1"?>
<RESPUESTA id="CONSULTA_EMPRESA" res="OK">
<LEMPRESAS>
<EMPRESA>
<PARAM id="codigo" valor=""/>
<PARAM id="nombre"> <![CDATA[]]> </PARAM>
<PARAM id="direccion"> <![CDATA[]]> </PARAM>
<PARAM id="poblacion"> <![CDATA[]]> </PARAM>
<PARAM id="provincia"> <![CDATA[]]> </PARAM>
<PARAM id="pais"> <![CDATA[]]> </PARAM>
</EMPRESA>
</LEMPRESAS>
</RESPUESTA>

res="OK" retorna siempre que se a realizado con exito.
De lo contrario, devuelve res="ERROR" y descripcion="Texto del error",
por ejemplo:

<?xml version="1.0" encoding="iso-8859-1"?>
<RESPUESTA id="CONSULTA_EMPRESA" res="ERROR" descripcion="No se puede...">


Es decir, el ejemplo que te he puesto, es capaz de leer un XML de entrada
para ocasionarte una XML de salida, 2x1 ;-)
Sinceramente, esto que te he puesto es MUCHISIMO más potente de usar.
Cualquier duda, por aqui.


Rafael,

Primero, agradezco los elemento que me has proporcionado y, segundo efectivamente, se que al meterse a trabajar con XMLs el requerimiento que tengo va ir crecendio eso es natural en cualquier proceso (pero de momento esto me resolvio el problema, ademas solo cargo la cadena una sola vez y de ahi uso las funciones de texto para buscar mis datos, que en este momento son basicos).

Lo que si te puedo decir es que la clase XMLRead esta fallando en el metodo oXML:GetValue(), ya que incluso con el mismo ejemplo de la clase no encuentra el elemento indicado, los demas metodos de esta clase si me han funcionado, pero al parecer hay que pagar para eliminar un msg que aparece.

Voy hacer las pruebas y te comento como me fue.

Gracias nuevamente.
Posts: 840
Joined: Thu Oct 13, 2005 07:05 PM
Leer datos especifico de un XML
Posted: Tue Oct 02, 2007 11:25 PM
MarioDava wrote:Asi es Armando, Grupo Olympus, si no mal recuerdo,


:-) ya ni me lo recuerden, cada vez que me acuerdo me entran ganas de asesinar a Gustavo Acosta. :-)

Nos vemos en Chile a partir del 12 de Octubre y en Argentina el 3 de Noviembre.
Saludos

R.F.
Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: Leer datos especifico de un XML
Posted: Fri May 04, 2012 08:14 PM
Hola Rafa

Una consulta estoy, enviando un xml a un webservice, este me responde de buena manera, pero la respuesta es un archivo adjunto, como puedo leer o capturar ese adjunto que viene con la respuesta... te dejo la respuesta del webservice


<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header>
      <cl:token xmlns:cl="cl.zofri.sve">4327b70a4411182b4--27e0df65-a4-2-60cb-3899 b521-3181-c:547389c8a67:fce22-337b72a1401481b7-22-e-dc60-2452e6-ca-08093b82 -81118c8597:84c3a478f2e:2</cl:token>
      <cl:respuesta xmlns:cl="cl.zofri.sve">
         <java:resCodigo xmlns:java="java:cl.zofri.sve.utl.bo">0</java:resCodigo>
         <java:resMensaje xmlns:java="java:cl.zofri.sve.utl.bo">Se ejecutó correctamente el servicio.</java:resMensaje>
         <java:resSeveridad xmlns:java="java:cl.zofri.sve.utl.bo">O</java:resSeveridad>
      </cl:respuesta>
   </env:Header>
   <env:Body>
      <m:exportarBorradoresResponse xmlns:m="http://cl/zofri/sve/prd/wsn">
         <m:return>
          <Include href="cid:return=d63bc3c4-682f-4d1c-9a2f-15c536a59db1@http://cl/zofri/sve/prd/wsn" xmlns="http://www.w3.org/2004/08/xop/include"/>  
 </m:return>
      </m:exportarBorradoresResponse>
   </env:Body>
</env:Envelope>
Fivewin-Xharbour 24.09, Iquique, Chile
Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: Leer datos especifico de un XML
Posted: Mon Jul 30, 2012 11:53 PM

Alguien sabe como extraer, o leer un archivo que viene como adjunto dentro de un xml

Fivewin-Xharbour 24.09, Iquique, Chile
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Re: Leer datos especifico de un XML
Posted: Tue Jul 31, 2012 11:19 AM

Hola elmoiquique,

Si el archivo adjunto esta codificado dentro del XML prueba a usar la funcion

fMimeDec( <cIn>, <cOut> )

donde:
<cIn> Un archivo que contiene el texto codificado
<cOut> El archivo resultante desencriptado (p.e. mipdf.pdf).

saludos :shock:

Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: Leer datos especifico de un XML
Posted: Tue Jul 31, 2012 06:32 PM
Hola Jose

Gracias por contestar, perdona mi ignorancia

Este es el XMl de respuesta en donde el tag <Include ref es donde creop que trae le archivo codificado .

ARCHIVO OUT.XML

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header xmlns:work="http://bea.com/2004/06/soap/workarea/">
<cl:token xmlns:cl="cl.zofri.sve">0e2099080517762c4--3bc04e97-f4-c-1303-0a88 a2d1-7f43-7:6434ab958b9:a6545-e40b9280507561c6-23-c-4090-147cc1-04-3ab80acd -3f13274673:af948495a95:5</cl:token>
<cl:respuesta xmlns:cl="cl.zofri.sve">
<java:resCodigo xmlns:java="java:cl.zofri.sve.utl.bo">0</java:resCodigo>
<java:resMensaje xmlns:java="java:cl.zofri.sve.utl.bo">Se ejecuto correctamente el servicio.</java:resMensaje>
<java:resSeveridad xmlns:java="java:cl.zofri.sve.utl.bo">O</java:resSeveridad>
</cl:respuesta>
<work:WorkContext xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
<java class="java.beans.XMLDecoder">
<string>weblogic.app.sveProcDocEAR</string>
<int>214</int>
<string>weblogic.workarea.StringWorkContext</string>
<string>r43.3</string>
<string>weblogic.app.KNAEar</string>
<int>214</int>
<string>weblogic.workarea.StringWorkContext</string>
<string>r43.2</string>
<string/>
</java>
</work:WorkContext>
</env:Header>
<env:Body>
<m:exportarBorradoresResponse xmlns:m="http://cl/zofri/sve/prd/wsn">
<m:return>
<Include href="cid:return=216af389-dcc9-4770-80fb-610304b481e0@http://cl/zofri/sve/prd/wsn" xmlns="http://www.w3.org/2004/08/xop/include"/>
</m:return>
</m:exportarBorradoresResponse>
</env:Body>
</env:Envelope>

Tu Me dices, seria algo asi o estoy equivocado


fMimeDec( <cIn>, <cOut> )

donde:
<cIn> out.xml
//Un archivo que contiene el texto codificado
<cOut> El archivo resultante desencriptado (p.e. mipdf.pdf).
Fivewin-Xharbour 24.09, Iquique, Chile
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Re: Leer datos especifico de un XML
Posted: Wed Aug 01, 2012 02:37 PM

En caso de que el archivo adjunto esté incrustado en el XML, debes extraer primero el bloque de texto leyendo el XML,
luego creas un archivo de texto cuyo contenido sea el bloque que acabas de estraer (p.e. "Origen.txt" y con

fMimeDec("origen.txt", "Salida.pdf")

lo tratas para obtener el archivo original.

si por el contrario, en el XML solo se alude a la dirección web donde está situado el archivo adjunto, el tema consiste en recuperarlo desde esa dirección.

ojalá te haya podido ayudar.
saludos :shock:

Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: Leer datos especifico de un XML
Posted: Wed Aug 01, 2012 06:09 PM

Hola Jose

Gracias por tu ayuda y por darte el tiempo de explicarme el tema ya que como ves soy un poco nuevo en este tema de xml y me han aparecido cosas nuevas, pero con respecto a tu comentario, la primera opcion no creo que sea, porque el documento en si no viene codificado dentro de este, mas bien por lo que mis conocimientos me dicen es que es una direccion web, solo a mi modo pensar, dentro de un pedazo del xml, viene esto lo que creo que es una direccion, pero no se como interpretarla, no se si tu has hecho este proceso, en el que me puedas ayudar..

Include href="cid:return=216af389-dcc9-4770-80fb-610304b481e0@http://cl/zofri/sve/prd/wsn" xmlns="http://www.w3.org/2004/08/xop/include"/>

<env:Body>
<m:exportarBorradoresResponse xmlns:m="http://cl/zofri/sve/prd/wsn">
<m:return>
<Include href="cid:return=216af389-dcc9-4770-80fb-610304b481e0@http://cl/zofri/sve/prd/wsn" xmlns="http://www.w3.org/2004/08/xop/include"/>
</m:return>
</m:exportarBorradoresResponse>
</env:Body>

Fivewin-Xharbour 24.09, Iquique, Chile
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Re: Leer datos especifico de un XML
Posted: Wed Aug 01, 2012 06:39 PM

Es posible que alguien con mas experiencia que yo en el tema, me contradiga, pero las direcciones del ejemplo no parece que contengan documento alguno, de hecho si pruebas a conectarte a las direcciones ves que indican formatos etc.
Quizás haya que ojear la documentación correspondiente para saber en que forma está adjunto el documento a esta respuesta.

Yo hasta ahora tengo mas experiencia en envíos que en respuestas, ojalá alguien pueda aportar algo mas en este sentido.

saludos :shock:

Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: Leer datos especifico de un XML
Posted: Thu Aug 02, 2012 04:17 PM

Hola Jose

Creo que estamos en las misma, solo he podido enviar documentos, y es la primera vez que me toca a la inversa, recuperar un acrchi desde el webservice, igual seguire investigando y buscando la solucion, si la encuentro, compartire la solucion por aca.. igual esperando la ayuda de otra persona sera bienvenida

Fivewin-Xharbour 24.09, Iquique, Chile
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: Leer datos especifico de un XML
Posted: Fri Aug 03, 2012 10:32 AM

Tienes que mirar en la DOC, que significa href , de lo contrario, va a ser casi imposible de donde obtener el fichero;

Include href="cid:return=216af389-dcc9-4770-80fb-610304b481e0@http://cl/zofri/sve/prd/wsn" xmlns="http://www.w3.org/2004/08/xop/include"/>

Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: Leer datos especifico de un XML
Posted: Tue Aug 07, 2012 09:59 PM

Gracias Rafa Por Contestar, bueno hasta ahorita no he podido solucionar el tema, he leido bastantes foro pero ninguno me lleva a solucionar el tema, te cuento lo que he investigado..

Sobre tu pregunta del href contien el nombre del archivo

return=216af389-dcc9-4770-80fb-610304b481e0@http://cl/zofri/sve/prd/wsn

Include href="cid:return=216af389-dcc9-4770-80fb-610304b481e0@http://cl/zofri/sve/prd/wsn" xmlns="http://www.w3.org/2004/08/xop/include"/>

Tambien he visto que en SOAPUI, tiene un request en cual tiene una viñeta XML y RAW, este ultimo contiene la informacion del docuemento que viene adjunto, esa seria la otra solucion leer el RAW, pero como le digo al servidor que en vez de contestarme con un XML me traiga un RAW, o existe alguna funcion que lo convierta.

Este es parte del programa que envia la pregunta y recupera la respuesta

doc = CreateObject( "MSXML2.DOMDocument" )
ohttp = CreateObject( "MSXML2.XMLHTTP" )

ohttp:Open( "POST" , ts_servidor , .F. )
ohttp:SetRequestHeader( "SOAPAction" , "Resultado" )
ohttp:SetRequestHeader( "Content-Type" , "text/xml" )
doc:LoadXML( ctext )
// ?"test "+doc:text
// ?"xml1 "+doc:xml
//envia la pregunta
ohttp:Send( doc:xml )

// do while doc:readystate<>4
// ?alltrim(str(doc:readystate))
// millisec(50)
// enddo

// ?"resp "+ohttp:responsetext
// ?"XML "+ohttp:responsexml:xml
//recupera la respuesta en formato XML
response = ohttp:responseText

Fivewin-Xharbour 24.09, Iquique, Chile

Continue the discussion