Leer datos especifico de un XML

MarioDava
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Re:

Post by MarioDava »

[quote="thefull"][quote="MarioDava"]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,


[quote="thefull"][quote="MarioDava"]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,
[/quote]
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:
[code]#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:oChild:cData // Para VALORES CDATA

oDoc := TXmlDocument():New() // Creacion del documento respuesta....
oDoc:oRoot: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:oRoot: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:oRoot: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

[/code]

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.[/quote]

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.
R.F.
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Post by R.F. »

MarioDava wrote:Asi es Armando, Grupo Olympus, si no mal recuerdo,
:twisted: ya ni me lo recuerden, cada vez que me acuerdo me entran ganas de asesinar a Gustavo Acosta. :evil:

Nos vemos en Chile a partir del 12 de Octubre y en Argentina el 3 de Noviembre.
Saludos
R.F.
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Leer datos especifico de un XML

Post by elmoiquique »

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 11.07
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Leer datos especifico de un XML

Post by elmoiquique »

Alguien sabe como extraer, o leer un archivo que viene como adjunto dentro de un xml
Fivewin 11.07
User avatar
José Vicente Beltrán
Posts: 279
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Re: Leer datos especifico de un XML

Post by José Vicente Beltrán »

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:
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Leer datos especifico de un XML

Post by elmoiquique »

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 11.07
User avatar
José Vicente Beltrán
Posts: 279
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Re: Leer datos especifico de un XML

Post by José Vicente Beltrán »

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:
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Leer datos especifico de un XML

Post by elmoiquique »

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 11.07
User avatar
José Vicente Beltrán
Posts: 279
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Re: Leer datos especifico de un XML

Post by José Vicente Beltrán »

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:
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Leer datos especifico de un XML

Post by elmoiquique »

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 11.07
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Re: Leer datos especifico de un XML

Post by thefull »

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__)
elmoiquique
Posts: 257
Joined: Wed May 16, 2007 9:40 pm
Location: Iquique Chile

Re: Leer datos especifico de un XML

Post by elmoiquique »

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 11.07
Post Reply