Leer datos especifico de un XML
Leer datos especifico de un XML
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
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
Mario:
No se si ya intentaste con XMLRead, una aportación de Timm
http://www.reportdesigner.info/
Ojalá te sirva
Saludos
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
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Mario:
Creo que sí, en las estulticias de las reuniones que teniamos con el mal logrado grupo de programadores de FW.
Saludos
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
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
- Manuel Aranda
- Posts: 561
- Joined: Wed Oct 19, 2005 8:20 pm
- Location: España
Re: Leer datos especifico de un XML
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
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
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
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
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
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:
En este grupo hay publicado unos mensajes mios sobre ;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
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__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Re:
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]
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:
Son simplemente las clases de xHarbour.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,
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__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
vale
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
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:
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]
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
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]
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:
Pues la libreria TIP creo que es la que contiene el tema de internet, XML, etc.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,
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
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__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Re:
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.
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__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)