uso de strexctract para obtener valores de tag en xml

510 views
Skip to first unread message

marcelo lopez

unread,
Oct 14, 2019, 2:06:07 PM10/14/19
to publicesvfoxpro
hola :


estoy usando la funcion strextract para obtener valores de tags, pasando el xml a un string con filetostring 


<FchVto>20191007</FchVto>
<FchProceso>20191007175130</FchProceso>

-<CbtesAsoc>
-     <CbteAsoc>

       <Tipo>201</Tipo>

        <PtoVta>324</PtoVta>

         <Nro>9</Nro>

         <Cuit>30707809147</Cuit>

     </CbteAsoc>
</CbtesAsoc>

Por ej con  <FchProceso> no tengo inconvenientes 
para obtener el valor : hago strextract( string,  <FchProceso>,  </FchProceso> )
el problema lo tengo para obtener el valor 
<Tipo> , que esta dentro de -<CbtesAsoc>  <CbteAsoc>  
    </CbteAsoc> </CbtesAsoc>  . Gracias a los que me traten de ayudar 

Libre de virus. www.avg.com

jose carlos aguilar

unread,
Oct 14, 2019, 2:12:10 PM10/14/19
to Comunidad de Visual Foxpro en Español
strextract es una excelente función para tratamiento de cadenas inclusive para parsear xml, pero te recomiendo usar algo como esto, me parece lo mas ideal para tratar xml. Saludos
FUNCTION FE_retornaRPTaTexto
PARAMETERS cNameFile as Character
mirespuesta=""
IF FILE(cNameFile)
cFileXML=FILETOSTR(cNameFile)
loXml     = CREATEOBJECT('Microsoft.XMLDOM')
IF !loXml.LoadXml(cFileXML)
   MESSAGEBOX('Sintaxis no Válida en Formato XML en línea:'+ STR(loXml.parseerror.line, 5, 0) +CHR(13 )+ CHR(10) + ALLTRIM(loXml.parseerror.reason) + ALLTRIM(STRTRAN(loXml.parseerror.srctext, CHR(9), '')),48,SoftWare)
   RETURN ""
ENDIF
codrpta = loXml.selectsinglenode("//cac:DocumentResponse//cac:Response//cbc:ResponseCode").Text
descripcionrpta = loXml.selectsinglenode("//cac:DocumentResponse//cac:Response//cbc:Description").Text
ENDIF 
RETURN "Cod:"+ codrpta + " Des:" + descripcionrpta
ENDFUNC

Irwin Rodriguez

unread,
Oct 14, 2019, 2:40:29 PM10/14/19
to publice...@googlegroups.com
Tienes que anidar el STREXTRACT hasta que llegues al nodo que deseas:

imagen.png

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/CAKGbfCZB-EEuSeevKZfZ%2BSFQaRsg35LdtEDqXxfAo3yNjb2FsQ%40mail.gmail.com.


--
Irwin Rodríguez
Programmer Analyst
"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

marcelo lopez

unread,
Oct 14, 2019, 6:50:14 PM10/14/19
to publicesvfoxpro
gracias por la ayuda !!! ahi lo pude resolver 

Libre de virus. www.avg.com

Marco Plaza

unread,
Oct 14, 2019, 9:44:00 PM10/14/19
to Comunidad de Visual Foxpro en Español

Usando la función nfXmlRead()  ( https://raw.githubusercontent.com/VFPX/nfXML/master/nfXml/nfXmlRead.prg ) 

puedes convertir cualquier xml en un objeto vfp.

Ejemplo: 

oXml = nfXmlread( tuXmlString )
de allí es lo mas simple acceder y visualizar tu xml:
? oxml.cbtesasoc.cbteasoc.tipo 

oxml.png






Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.


--
Irwin Rodríguez
Programmer Analyst
"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

HernanCano

unread,
Oct 15, 2019, 1:25:31 AM10/15/19
to Comunidad de Visual Foxpro en Español
Marco:
Mi escenario es el sgte:

1. El EJEMPLO.XML

<FchVto>20191007</FchVto>
<FchProceso>20191007175130</FchProceso>

-<CbtesAsoc>
-     <CbteAsoc>

       <Tipo>201</Tipo>

        <PtoVta>324</PtoVta>

         <Nro>9</Nro>

         <Cuit>30707809147</Cuit>

     </CbteAsoc>
</CbtesAsoc

2. El EJEMPLO.PRG

local tuXmlString
tuXmlString = FileToStr('EJEMPLO.XML')

oXml = nfXmlread( tuXmlString )
** de allí es lo mas simple acceder y visualizar tu xml:
? oxml.cbtesasoc.cbteasoc.tipo 

3. El mensaje de error lo muestro en la imagen adjunta.

¿Me ayudas a solucionar el error?

Gracias.

borrar.png


Irwin Rodriguez

unread,
Oct 15, 2019, 2:42:03 AM10/15/19
to publice...@googlegroups.com
Buenisimo Marco, no sabía que tenías esta utilidad. Gracias!

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/27f96231-4f71-42aa-8c5b-88dbb42872a5%40googlegroups.com.

HernanCano

unread,
Oct 15, 2019, 9:54:50 AM10/15/19
to Comunidad de Visual Foxpro en Español
Marco:
Lo solucioné agregando un tag al que llamé Raiz según lo sgte:

1. En el XML, quedó así:

<Raiz>
  <FchVto>20191007</FchVto>
  <FchProceso>20191007175130</FchProceso>
  <CbtesAsoc>
    <CbteAsoc>
       <Tipo>201</Tipo>
       <PtoVta>324</PtoVta>
       <Nro>9</Nro>
       <Cuit>30707809147</Cuit>
     </CbteAsoc>
  </CbtesAsoc>
</Raiz>

2. El PRG quedó así:

local tuXmlString
tuXmlString = FileToStr('EJEMPLO.XML')

oXml = nfXmlread( tuXmlString )
** de allá es lo más simple acceder y visualizar tu xml:
*!* ? oxml.cbtesasoc.cbteasoc.tipo 
? oxml.raiz.cbtesasoc.cbteasoc.tipo 

Y ya funciona como debería.

Gracias a todos por compartir.

Carlos Alfaro

unread,
Oct 15, 2019, 10:12:22 AM10/15/19
to publice...@googlegroups.com

Saludos cordiales estimado Marco Plaza:

 

Muchas gracias por compartir ese programa.

 

He probado tu programa con VFP9, pero me muestra error en el siguiente codigo:

*------------------------------

Function conv2asc( ctag )

*------------------------------

 

Local N

 

ctag = Strtran(m.ctag,'_','__')

 

For N = 2 To escapecount*2 Step 2

                m.ctag = Strtran(m.ctag,Getwordnum(escapelist,m.n-1,','), Getwordnum(escapelist,m.n,',') )

Endfor

 

Return m.ctag

 

No encuentro las variables: escapecount y escapelist.

 

Podrias comentar si falta hacer algo?

 

Buen dia.

 

 

Carlos Alfaro

 

From: publice...@googlegroups.com [mailto:publice...@googlegroups.com] On Behalf Of Irwin Rodriguez
Sent: martes, 15 de octubre de 2019 12:42 a.m.
To: publice...@googlegroups.com
Subject: Re: [vfp] uso de strexctract para obtener valores de tag en xml

 

Buenisimo Marco, no sabía que tenías esta utilidad. Gracias!

 

El mar., 15 oct. 2019 a las 3:44, Marco Plaza (<stma...@gmail.com>) escribió:

puedes convertir cualquier xml en un objeto vfp.

 

Ejemplo: 

 

oXml = nfXmlread( tuXmlString )

de allí es lo mas simple acceder y visualizar tu xml:

? oxml.cbtesasoc.cbteasoc.tipo 

 

oxml.png

 



El lunes, 14 de octubre de 2019, 18:50:14 (UTC-4), marcelo echaniz escribió:

gracias por la ayuda !!! ahi lo pude resolver 

 

Libre de virus www.avg.com

 

El lun., 14 oct. 2019 a las 15:40, Irwin Rodriguez (<rodrigu...@gmail.com>) escribió:

Tienes que anidar el STREXTRACT hasta que llegues al nodo que deseas:

 

imagen.png

 

El lun., 14 oct. 2019 a las 20:06, marcelo lopez (<marceloe...@gmail.com>) escribió:

hola :

 

 

estoy usando la funcion strextract para obtener valores de tags, pasando el xml a un string con filetostring 

 

 

<FchVto>20191007</FchVto>
<FchProceso>20191007175130</FchProceso>

-<CbtesAsoc>
-     <CbteAsoc>

       <Tipo>201</Tipo>

        <PtoVta>324</PtoVta>

         <Nro>9</Nro>

         <Cuit>30707809147</Cuit>

     </CbteAsoc>
</CbtesAsoc>

 

Por ej con  <FchProceso> no tengo inconvenientes 

para obtener el valor : hago strextract( string,  <FchProceso>,  </FchProceso> )

el problema lo tengo para obtener el valor 

<Tipo> , que esta dentro de -<CbtesAsoc>  <CbteAsoc>  

    </CbteAsoc> </CbtesAsoc>  . Gracias a los que me traten de ayudar 

 

Libre de virus www.avg.com

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/CAKGbfCZB-EEuSeevKZfZ%2BSFQaRsg35LdtEDqXxfAo3yNjb2FsQ%40mail.gmail.com.



--

Irwin Rodríguez

Programmer Analyst

"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/CABooBBkqEk09WCy4ZmVgV2eA9uQJsbWz7oFCn_6GEb8vhdAmMQ%40mail.gmail.com.

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/27f96231-4f71-42aa-8c5b-88dbb42872a5%40googlegroups.com.


 

--

Irwin Rodríguez

Programmer Analyst

"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

image001.jpg

Carlos Alfaro

unread,
Oct 15, 2019, 10:48:52 AM10/15/19
to publice...@googlegroups.com

Ya encontre la referencia de cómo resolverlo es con nfxml.h

image001.jpg

Marco Plaza

unread,
Oct 15, 2019, 5:53:13 PM10/15/19
to Comunidad de Visual Foxpro en Español
Hola, un archivo xml debe tener un único nodo raiz. el extracto que públicas no es un xml válido, por eso el error.

para que tu string sea xml válido, debe tener la estructura siguiente:

<xml>
<FchVto>20191007</FchVto>
<FchProceso>20191007175130</FchProceso>

<CbtesAsoc>
     <CbteAsoc>

       <Tipo>201</Tipo>

        <PtoVta>324</PtoVta>

         <Nro>9</Nro>

         <Cuit>30707809147</Cuit>

     </CbteAsoc>
</CbtesAsoc>

</xml>


Marco Plaza

unread,
Oct 15, 2019, 6:02:12 PM10/15/19
to Comunidad de Visual Foxpro en Español

Hola, llegué tarde a ver los comentarios, pero veo que ya solventaron los inconvenientes.

nfXml devolverá un error si el xml tiene algún probema o el archivo no existe, igual que si abres un dbf dañado, de manera que si no confías en la fuente del xml es buena idea envolver la llamada en un try-catch.

Cualquier cosa pueden enviarme sus comentarios, consultas y experiencias de uso.

Saludos.

Marco Plaza

unread,
Oct 15, 2019, 6:11:54 PM10/15/19
to Comunidad de Visual Foxpro en Español
Hola Carlos, disculpen que compartí el link al fuente del programa .

El proyecto está en https://github.com/vfpx/nfXml allí simplemente descargar usando el link:


Saludos.




 

--

Irwin Rodríguez

Programmer Analyst

"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Marco Plaza

unread,
Oct 15, 2019, 6:42:12 PM10/15/19
to Comunidad de Visual Foxpro en Español

Hola Irwin, si.. a veces uno cree que sólo porque está publicado ya todos lo vieron..

Saludos.!

Carlos Alfaro

unread,
Oct 15, 2019, 8:15:04 PM10/15/19
to publice...@googlegroups.com

Es muy buen herramienta, muchas gracias.

 

Carlos Alfaro

 

From: publice...@googlegroups.com [mailto:publice...@googlegroups.com] On Behalf Of Marco Plaza
Sent: martes, 15 de octubre de 2019 04:42 p.m.
To: Comunidad de Visual Foxpro en Español
Subject: Re: [vfp] uso de strexctract para obtener valores de tag en xml

 

 

Hola Irwin, si.. a veces uno cree que sólo porque está publicado ya todos lo vieron..

 

Saludos.!

El martes, 15 de octubre de 2019, 2:42:03 (UTC-4), Irwin Rodriguez escribió:

Buenisimo Marco, no sabía que tenías esta utilidad. Gracias!

 

El mar., 15 oct. 2019 a las 3:44, Marco Plaza (<stma...@gmail.com>) escribió:

puedes convertir cualquier xml en un objeto vfp.

 

Ejemplo: 

 

oXml = nfXmlread( tuXmlString )

de allí es lo mas simple acceder y visualizar tu xml:

? oxml.cbtesasoc.cbteasoc.tipo 

 

oxml.png

 



El lunes, 14 de octubre de 2019, 18:50:14 (UTC-4), marcelo echaniz escribió:

gracias por la ayuda !!! ahi lo pude resolver 

 

Libre de virus www.avg.com

 

El lun., 14 oct. 2019 a las 15:40, Irwin Rodriguez (<rodrigu...@gmail.com>) escribió:

Tienes que anidar el STREXTRACT hasta que llegues al nodo que deseas:

 

imagen.png

 

El lun., 14 oct. 2019 a las 20:06, marcelo lopez (<marceloe...@gmail.com>) escribió:

hola :

 

 

estoy usando la funcion strextract para obtener valores de tags, pasando el xml a un string con filetostring 

 

 

<FchVto>20191007</FchVto>
<FchProceso>20191007175130</FchProceso>

-<CbtesAsoc>
-     <CbteAsoc>

       <Tipo>201</Tipo>

        <PtoVta>324</PtoVta>

         <Nro>9</Nro>

         <Cuit>30707809147</Cuit>

     </CbteAsoc>
</CbtesAsoc>

 

Por ej con  <FchProceso> no tengo inconvenientes 

para obtener el valor : hago strextract( string,  <FchProceso>,  </FchProceso> )

el problema lo tengo para obtener el valor 

<Tipo> , que esta dentro de -<CbtesAsoc>  <CbteAsoc>  

    </CbteAsoc> </CbtesAsoc>  . Gracias a los que me traten de ayudar 

 

Libre de virus www.avg.com

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.



--

Irwin Rodríguez

Programmer Analyst

"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/CABooBBkqEk09WCy4ZmVgV2eA9uQJsbWz7oFCn_6GEb8vhdAmMQ%40mail.gmail.com.

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/27f96231-4f71-42aa-8c5b-88dbb42872a5%40googlegroups.com.


 

--

Irwin Rodríguez

Programmer Analyst

"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/d3b50aba-261b-4601-8f19-41346320893d%40googlegroups.com.

HernanCano

unread,
Oct 15, 2019, 10:21:15 PM10/15/19
to Comunidad de Visual Foxpro en Español
Claro, Marco. Muchísimas gracias.

Pablo Nicolás Merlo

unread,
Oct 17, 2019, 7:13:19 PM10/17/19
to Comunidad de Visual Foxpro en Español
Muchas gracias por el aporte.

Tengo los siguientes tags en mi xml

<variables>
<variable>
<nombre clase="O"><![CDATA[DU/CUIT]]></nombre>
<valor tipo="C"><![CDATA[99999999]]></valor>
</variable>
<variables>

Como hago para obtener la del tag <valor>?

Con el resto de los tags de mi xml pude obtener los datos pero con esos se me complico. Espero que alguien pueda ayudarme

Saludos

HernanCano

unread,
Oct 17, 2019, 7:28:16 PM10/17/19
to Comunidad de Visual Foxpro en Español
Pablo:
Como ya mencionó Irwin cuando escribió lo de "anidar":

M.cToda    = strextract( M.cString  , '<variables>', '</variables>')
M.cVariable= strextract( M.cToda    , '<variable>' , '</variable>' )
M.cValor   = strextract( M.cVariable, '<valor tipo="C">', '</valor>')

Esteban H

unread,
Oct 18, 2019, 7:07:22 PM10/18/19
to publice...@googlegroups.com

Hola Marco.

 

Estuve probando tu librería con unos XML complicados y funciona perfecto.

Lo q me quedaría x hacer es un programa p recorrer los nodos del objeto resultante y validar los datos.

 

Gracias…

 

Saludos

Esteban.

 

Libre de virus www.avg.com

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.



--

Irwin Rodríguez

Programmer Analyst

"A team is only pieces that you exchange until you finish the work, it is efficient, it works."

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/CABooBBkqEk09WCy4ZmVgV2eA9uQJsbWz7oFCn_6GEb8vhdAmMQ%40mail.gmail.com.

--

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/27f96231-4f71-42aa-8c5b-88dbb42872a5%40googlegroups.com.

image001.jpg

Marco Plaza

unread,
Oct 18, 2019, 11:12:04 PM10/18/19
to Comunidad de Visual Foxpro en Español

Gracias Esteban, estoy siempre pendiente en caso de duda.

Saludos.


Reply all
Reply to author
Forward
0 new messages