Page 1 of 2

Leer datos especifico de un XML

Posted: Wed Sep 26, 2007 11:59 pm
by MarioDava
Hola a todos,

Requiero leer datos especificos de una archivo XML, he intentado lo que encontre aqui en el foro, pero no me funciona, por lo que requiero ayuda, lo que he notado es que la forma de mis XML es ligeramente diferente, anexo unas lineas de mi XML.

Por ejemplo del siguiente codigo requiero leer el valor de:
<NODECLIENTE> que es 1072

Como lo hago?

<?xml version='1.0' encoding='iso-8859-1'?>
<xml>
<root>
<PLACEHOLDER>
<Content>FAC001335082007</Content>
<FOLDER_NAME>200708</FOLDER_NAME>
<OM.SEQUENCE>233</OM.SEQUENCE>
<OUTPUT_KIND>O</OUTPUT_KIND>
<OProt_Name>Hardcopy</OProt_Name>
<LTemplate_Name>Factura XML</LTemplate_Name>
<Contact_Country>México</Contact_Country>
<Contact_Formatted>AMATISTA 780/
VALLE DORADO (12), CP. 78399
San Luis Potosi
San Luis Potosí</Contact_Formatted>
<Contact_ContactPerson>VERONICA MARTINEZ ALMENDAREZ</Contact_ContactPerson>
<Contact_FormattedLine4>San Luis Potosí</Contact_FormattedLine4>
<Contact_FormattedLine3>San Luis Potosi</Contact_FormattedLine3>
<Contact_FormattedLine2>VALLE DORADO (12), CP. 78399</Contact_FormattedLine2>
<Contact_FormattedLine1>AMATISTA 780/</Contact_FormattedLine1>
<CAcc_ExternalAccNumber>728</CAcc_ExternalAccNumber>
<CAcc_InternalAccNumber>875</CAcc_InternalAccNumber>
<CP_Type_Name>Residencial</CP_Type_Name>
<CP_TaxGroup_Name>Básico</CP_TaxGroup_Name>
<CP_TaxGroup_Symbol>CPartyTaxGroup</CP_TaxGroup_Symbol>
<CP_InternalCPNumber>1072</CP_InternalCPNumber>
<CP_ExternalCPNumber>10097758</CP_ExternalCPNumber>
<OP_Type_Name>Provedor de facturación</OP_Type_Name>
<OP_TaxGroup_Name>Basic</OP_TaxGroup_Name>
<OP_TaxGroup_Symbol>BProviderTaxGroup</OP_TaxGroup_Symbol>
<OP_InternalCPNumber>26</OP_InternalCPNumber>
<REFERENCE>FACXML001372082007</REFERENCE>
<OM.IssueDateDay>20</OM.IssueDateDay>
<OM.IssueDateMonth>08</OM.IssueDateMonth>
<OM.IssueDateYear>2007</OM.IssueDateYear>
<OItem_Id>2532</OItem_Id>
<PInstance_Id>287</PInstance_Id>
</PLACEHOLDER>
<EstadoDeCuenta>
<NODECLIENTE>1072</NODECLIENTE>
<NODECUENTA>875</NODECUENTA>
<NODEFACTURA>FAC001335082007</NODEFACTURA>
<FECHADEEDICION>20-08-2007</FECHADEEDICION>

Agradecer cualquier ayuda, igual si quieren contactarme directamente.

Mario A. Dávalos
Mexico, D.F.
mariodava@hotamil.com

Posted: Thu Sep 27, 2007 12:33 am
by Armando
Mario:

No se si ya intentaste con XMLRead, una aportación de Timm

http://www.reportdesigner.info/

Ojalá te sirva

Saludos

Posted: Thu Sep 27, 2007 2:08 pm
by MarioDava
Armando no lo he probado, sinceramente no lo conocia, lo voy a bajar, te agradezco mucho, una pregunta mas, nos conocemos verdad?

Un abrazo
Mario A. Dávalos

Posted: Thu Sep 27, 2007 2:55 pm
by Armando
Mario:

Creo que sí, en las estulticias de las reuniones que teniamos con el mal logrado grupo de programadores de FW.

Saludos

Re: Leer datos especifico de un XML

Posted: Thu Sep 27, 2007 5:01 pm
by Manuel Aranda
Hola Mario, un fichero XML lo puedes tratar como un fichero de texto plano y como tal solo tienes que localizar la cadena que quieras y extraer _ que te interesen a partir de esa cadena.
Ejemplo:
cTexto=memoread( "fichero.xml" )
//
nHandle:=FOpen("fichero.xml", FO_READWRITE + FO_SHARED)
//
nPos=AT("<NODECLIENTE>",cTexto)
//
FSeek(nHandle,nPos+13)
FRead(nHandle,@cNumCliente,4)


Espero te sirva.

Un saludo,
Manuel Aranda
MarioDava wrote:Hola a todos,

Requiero leer datos especificos de una archivo XML, he intentado lo que encontre aqui en el foro, pero no me funciona, por lo que requiero ayuda, lo que he notado es que la forma de mis XML es ligeramente diferente, anexo unas lineas de mi XML.

Por ejemplo del siguiente codigo requiero leer el valor de:
<NODECLIENTE> que es 1072

Como lo hago?

<?xml version='1.0' encoding='iso-8859-1'?>
<xml>
<root>
<PLACEHOLDER>
<Content>FAC001335082007</Content>
<FOLDER_NAME>200708</FOLDER_NAME>
<OM.SEQUENCE>233</OM.SEQUENCE>
<OUTPUT_KIND>O</OUTPUT_KIND>
<OProt_Name>Hardcopy</OProt_Name>
<LTemplate_Name>Factura XML</LTemplate_Name>
<Contact_Country>México</Contact_Country>
<Contact_Formatted>AMATISTA 780/
VALLE DORADO (12), CP. 78399
San Luis Potosi
San Luis Potosí</Contact_Formatted>
<Contact_ContactPerson>VERONICA MARTINEZ ALMENDAREZ</Contact_ContactPerson>
<Contact_FormattedLine4>San Luis Potosí</Contact_FormattedLine4>
<Contact_FormattedLine3>San Luis Potosi</Contact_FormattedLine3>
<Contact_FormattedLine2>VALLE DORADO (12), CP. 78399</Contact_FormattedLine2>
<Contact_FormattedLine1>AMATISTA 780/</Contact_FormattedLine1>
<CAcc_ExternalAccNumber>728</CAcc_ExternalAccNumber>
<CAcc_InternalAccNumber>875</CAcc_InternalAccNumber>
<CP_Type_Name>Residencial</CP_Type_Name>
<CP_TaxGroup_Name>Básico</CP_TaxGroup_Name>
<CP_TaxGroup_Symbol>CPartyTaxGroup</CP_TaxGroup_Symbol>
<CP_InternalCPNumber>1072</CP_InternalCPNumber>
<CP_ExternalCPNumber>10097758</CP_ExternalCPNumber>
<OP_Type_Name>Provedor de facturación</OP_Type_Name>
<OP_TaxGroup_Name>Basic</OP_TaxGroup_Name>
<OP_TaxGroup_Symbol>BProviderTaxGroup</OP_TaxGroup_Symbol>
<OP_InternalCPNumber>26</OP_InternalCPNumber>
<REFERENCE>FACXML001372082007</REFERENCE>
<OM.IssueDateDay>20</OM.IssueDateDay>
<OM.IssueDateMonth>08</OM.IssueDateMonth>
<OM.IssueDateYear>2007</OM.IssueDateYear>
<OItem_Id>2532</OItem_Id>
<PInstance_Id>287</PInstance_Id>
</PLACEHOLDER>
<EstadoDeCuenta>
<NODECLIENTE>1072</NODECLIENTE>
<NODECUENTA>875</NODECUENTA>
<NODEFACTURA>FAC001335082007</NODEFACTURA>
<FECHADEEDICION>20-08-2007</FECHADEEDICION>

Agradecer cualquier ayuda, igual si quieren contactarme directamente.

Mario A. Dávalos
Mexico, D.F.
mariodava@hotamil.com

Posted: Thu Sep 27, 2007 8:49 pm
by MarioDava
Manuel, te agradezco tu tip

Y si efectivamente ya lo habia pensado manipularlo con funciones de bajo nivel, pero antes de llegar a eso voy atratar con la clase XMLRead, que me entero no es free.

Aunque te sere sincero, como lo dije solo quiero traer algunos datos y realmente no se si sea lo mas convieniente esta calse o tratarlo como texto plano.

Si alguien sabe la diferencia, estaría bueno el comentario.

Gracias Miguel

Posted: Thu Sep 27, 2007 8:54 pm
by MarioDava
Asi es Armando, Grupo Olympus, si no mal recuerdo, pero veo que no estas en el D.F., donde andas?

Por ciero todavia no pruebo la XMLRead, pero es exactamente lo que ando buscando, gracias

Un abrazo
Armando wrote:Mario:

Creo que sí, en las estulticias de las reuniones que teniamos con el mal logrado grupo de programadores de FW.

Saludos

Re:

Posted: Thu Sep 27, 2007 9:05 pm
by thefull
MarioDava wrote:Asi es Armando, Grupo Olympus, si no mal recuerdo, pero veo que no estas en el D.F., donde andas?

Por ciero todavia no pruebo la XMLRead, pero es exactamente lo que ando buscando, gracias

Un abrazo
Armando wrote:Mario:

Creo que sí, en las estulticias de las reuniones que teniamos con el mal logrado grupo de programadores de FW.

Saludos
En este grupo hay publicado unos mensajes mios sobre ;
1.- Como leer un XML
2.- Como guardar un XML.

Busca los articulos mios por aqui, que tienen que estar y te
serán de gran ayuda.

Re:

Posted: Fri Sep 28, 2007 3:57 pm
by 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="thefull"][quote="MarioDava"]Asi es Armando, Grupo Olympus, si no mal recuerdo, pero veo que no estas en el D.F., donde andas?

Por ciero todavia no pruebo la XMLRead, pero es exactamente lo que ando buscando, gracias

Un abrazo

[quote="Armando"]Mario:

Creo que sí, en las estulticias de las reuniones que teniamos con el mal logrado grupo de programadores de FW.

Saludos[/quote][/quote]

En este grupo hay publicado unos mensajes mios sobre ;
1.- Como leer un XML
2.- Como guardar un XML.

Busca los articulos mios por aqui, que tienen que estar y te
serán de gran ayuda.[/quote]

Re:

Posted: Sat Sep 29, 2007 7:33 am
by thefull
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,
Son simplemente las clases de xHarbour.
No se si esta disponible en Harbour, en caso de que uses este compilador.

Pero te aseguro que la clase de xHarbour , ademas de ser muy rapida, es ademas de gran ayuda ;-)

vale

Posted: Sat Sep 29, 2007 2:14 pm
by fleal
Mario,
Para extraer los datos del XML


oText := TTxtFile():New( "ARCHIVO.XML" )
oText:nMaxLineLength := 500
nRen := oText:RecCount() + 1


Cada uno de las lineas tiene un identificador único... por ejemplo:
<Contact_ContactPerson>VERONICA MARTINEZ ALMENDAREZ</Contact_ContactPerson>

FOR i := 1 TO nRen
cDatos := alltrim( oText:ReadLine() ) // una linea es un dato
if "<Contact_ContactPerson>"$cDatos
cDatos := strtran( cDatos, "<Contact_ContactPerson>",""
cDatos := strtran( cDatos, "</Contact_ContactPerson>",""

Con lo anterior solo queda
VERONICA MARTINEZ ALMENDAREZ

Y asi sucesivamente con cualquier otro datos. El resultado de cada linea lo guardas en una hoja excel, texto, dbf o en lo que quieras.


Fernando Leal
México, DF

Re:

Posted: Mon Oct 01, 2007 2:04 pm
by 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]
Son simplemente las clases de xHarbour.
No se si esta disponible en Harbour, en caso de que uses este compilador.

Pero te aseguro que la clase de xHarbour , ademas de ser muy rapida, es ademas de gran ayuda ;-)[/quote]

Re: vale

Posted: Mon Oct 01, 2007 2:12 pm
by MarioDava
Mi estimado Fer, lo resolvi de esta manera:

cTexto := Memoread( "c:\printouts" + cUltimo + "" + aXMLNom[ I ] )
nPos := AT("<NODECLIENTE>",cTexto)
cNumCliente := substr( ctexto, nPos + 13, 6 )
cNumCliente := DejaNumeros( cNumCliente )

donde solo implemente la funcion DejaNumeros(), para resolver _ en que el dato tenga longitud variable (en este caso contemplo desde 1 a 6 digitos) y como se que mi dato solo es numerico, pues le quito _ que no lo sean.

Es similar a lo que me propones, pero practicamente solo ocupo 4 lineas.

Saludos,




[quote="fleal"]Mario,
Para extraer los datos del XML


oText := TTxtFile():New( "ARCHIVO.XML" )
oText:nMaxLineLength := 500
nRen := oText:RecCount() + 1


Cada uno de las lineas tiene un identificador único... por ejemplo:
<Contact_ContactPerson>VERONICA MARTINEZ ALMENDAREZ</Contact_ContactPerson>

FOR i := 1 TO nRen
cDatos := alltrim( oText:ReadLine() ) // una linea es un dato
if "<Contact_ContactPerson>"$cDatos
cDatos := strtran( cDatos, "<Contact_ContactPerson>",""
cDatos := strtran( cDatos, "</Contact_ContactPerson>",""

Con lo anterior solo queda
VERONICA MARTINEZ ALMENDAREZ

Y asi sucesivamente con cualquier otro datos. El resultado de cada linea lo guardas en una hoja excel, texto, dbf o en lo que quieras.


Fernando Leal
México, DF[/quote]

Re:

Posted: Tue Oct 02, 2007 7:56 am
by thefull
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:

Code: Select all

#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

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.

Re:

Posted: Tue Oct 02, 2007 8:27 am
by thefull
Por ultimo , la clase TXML, esta ya incluida en la RTL de xHarbour, puedes
consultarla en xharbour/source/rl/txml.prg

Pero, por si acaso, linka la libreria pcrepos con la aplicacion.