dbf2xml can be found on the web as well (somewhere)
*-- ASCII codes
#DEFINE TAB CHR(9)
#DEFINE lf CHR(10)
#DEFINE cr CHR(13)
#DEFINE cr_lf cr+lf
* Dbf2xml.prg
*************************
* PROCEDURE dbf2xml
PARAMETERS tctable, tcscope, tntabindents
PRIVATE lctable, lcalias, lcscope, lcdbfname, lcindenttext, lcdbf, lcrootname
PRIVATE lcvalue, lcfield, lnfieldcount, lncount, lnlastselect, lnlastrecno
PRIVATE lcxmltext
DIMENSION lafields[1]
IF NOT INLIST(TYPE('tctable'), "C", "L"

OR NOT ;
INLIST(TYPE('tcscope'), "C", "L"

RETURN ""
ENDIF
lcindenttext = IIF(TYPE('tntabindents') == "N", ;
REPLICATE(TAB, tntabindents), ""

lctable = LOWER(IIF(EMPTY(tctable), ALIAS(), ALLTRIM(tctable)))
lnlastselect=SELECT()
IF "." $ lctable
lcdbf = lctable
IF NOT FILE(lcdbf)
RETURN ""
ENDIF
SELECT 0
lcalias = LOWER(SYS(2015))
USE (lcdbf) ALIAS (lcalias) AGAIN shared
lcdbfname = LOWER(forceext(justfname(DBF()), ""

)
ELSE
lcdbf = ""
lcalias = lctable
lcdbfname = lcalias
ENDIF
IF NOT USED(lcalias)
SELECT (lnlastselect)
RETURN ""
ENDIF
lcscope = IIF(EMPTY(tcscope), "ALL", ALLTRIM(tcscope))
SELECT (lcalias)
lnlastrecno = IIF(EOF(), 0, RECNO())
lcxmltext = "<"+ lcdbfname + "_table>" + cr_lf
lnfieldcount = AFIELDS(lafields)
IF lnfieldcount = 0
SELECT (lnlastselect)
RETURN ""
ENDIF
lcrootname = lcdbfname
DO WHILE TYPE(lcrootname) != "U"
lcrootname = lcrootname + "1"
ENDDO
SCAN
lcxmltext = lcxmltext + lcindenttext + ;
"<" + lcrootname + ">" + cr_lf
FOR lncount = 1 TO lnfieldcount
lcfield = LOWER(lafields[lnCount, 1])
lcvalue = EVALUATE(lcfield)
lcvalue = std_tran(lcvalue)
IF EMPTY(lcvalue)
LOOP
ENDIF
lcxmltext=lcxmltext + lcindenttext + TAB + ;
"<" + lcfield + ">" + lcvalue + "</" + lcfield + ">" + cr_lf
ENDFOR
lcxmltext = lcxmltext + lcindenttext + ;
"</" + lcrootname + ">" + cr_lf
ENDSCAN
IF EMPTY(lcdbf)
IF lnlastrecno > 0
GO lnlastrecno
ENDIF
ELSE
USE
ENDIF
SELECT (lnlastselect)
lcxmltext = lcxmltext + cr_lf + "</"+ lcdbfname + "_table>"
RETURN lcxmltext