Leer datos especifico de un XML

Leer datos especifico de un XML

Postby MarioDava » Wed Sep 26, 2007 11:59 pm

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
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Postby Armando » Thu Sep 27, 2007 12:33 am

Mario:

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

http://www.reportdesigner.info/

Ojalá te sirva

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: 3242
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Postby MarioDava » Thu Sep 27, 2007 2:08 pm

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
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Postby Armando » Thu Sep 27, 2007 2:55 pm

Mario:

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

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: 3242
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Leer datos especifico de un XML

Postby Manuel Aranda » Thu Sep 27, 2007 5:01 pm

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 los caracteres 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
User avatar
Manuel Aranda
 
Posts: 604
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Postby MarioDava » Thu Sep 27, 2007 8:49 pm

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
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Postby MarioDava » Thu Sep 27, 2007 8:54 pm

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
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Re:

Postby thefull » Thu Sep 27, 2007 9:05 pm

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.
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Re:

Postby MarioDava » Fri Sep 28, 2007 3:57 pm

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]
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Re:

Postby thefull » Sat Sep 29, 2007 7:33 am

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 ;-)
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

vale

Postby fleal » Sat Sep 29, 2007 2:14 pm

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
fleal
 
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

Re:

Postby MarioDava » Mon Oct 01, 2007 2:04 pm

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]
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Re: vale

Postby MarioDava » Mon Oct 01, 2007 2:12 pm

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 los casos 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 los caracteres 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]
MarioDava
 
Posts: 18
Joined: Mon Jan 29, 2007 1:29 am

Re:

Postby thefull » Tue Oct 02, 2007 7:56 am

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  Expand view  RUN
#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.
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Re:

Postby thefull » Tue Oct 02, 2007 8:27 am

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.
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Next

Return to FiveWin para Harbour/xHarbour

Who is online

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