************************************************************************************ * Program created by Marco Plaza , 2013-2016 * vfp2nofox@gmail.com * @vfp2nofox * REVISION 1.0500 2016/08/09 ************************************************************************************ Parameters ovfp,nofmt #INCLUDE NFXML.H If Vartype(m.ovfp) # 'O' Or Vartype(m.nofmt) # 'L' Error "Invalid parameter type" Endif Private All m.crlf = Iif(!m.nofmt,Chr(13)+Chr(10),'') cxml='' =o2xml(m.ovfp,'','',m.crlf) If Amembers(aa,m.ovfp,0,'U') > 1 cxml = ''+m.cxml+m.crlf+'' Endif cxml = ''+m.cxml Return Strconv(m.cxml,9) *----------------------------------------------------------- Function o2xml(esteo,oname,nivel,m.crlf,atributos,atclosetag) *----------------------------------------------------------- oname = Lower(m.oname) Private All Except cxml closetag = '' otag = xtag(m.oname) np = Amembers(aprop,m.esteo,0,'U') Do Case Case atributos closetag = m.atclosetag Case !Empty(m.otag) cxml = m.cxml+m.crlf+m.nivel+'<'+m.otag If Type('esteo.'+ATTRIBUTETAG) # 'O' cxml = m.cxml+'>' Endif If Type('esteo.'+ATTRIBUTETAG) # 'O' Or np > 1 closetag = m.crlf+m.nivel+'' Endif Endcase If '' # m.crlf nivel = m.nivel+Space(3) Endif If np > 0 * colocar atributos de 1ero: npa = Ascan(aprop,ATTRIBUTETAG,1,-1,1,1) If npa > 0 =Acopy(aprop,tempa) aprop(1) = tempa(npa) aprop(npa) = tempa(1) Endif For Each vari In m.aprop esarray = Type('esteo.&vari',1) = 'A' esobjeto = Type('esteo.&vari') = 'O' Do Case Case Lower(m.vari) = ATTRIBUTETAG =o2xml(esteo.&vari,m.vari,m.nivel,m.crlf, .T. , Iif(m.np > 1,'>','/>') ) Case esarray For x = 1 To Alen(esteo.&vari) m.ele = esteo.&vari(m.x) If Vartype(m.ele) = 'O' =o2xml(m.ele,m.vari,m.nivel,m.crlf) Else valorAxml( m.vari, m.ele , m.atributos , m.nivel ) Endif Endfor Case esobjeto =o2xml(esteo.&vari,m.vari,m.nivel,m.crlf) Otherwise valorAxml( m.vari, esteo.&vari , m.atributos , m.nivel ) Endcase Endfor Endif cxml = m.cxml+m.closetag *------------------------ Function xtag(kk) *------------------------ If Lower(m.kk) == ATTRIBUTETAG Or Lower(M.kk) == NODETEXTTAG Return m.kk Endif tr = Sys(3) kk = Strtran(m.kk,'__',m.tr) kk = Ltrim( m.kk,1,'_') kk = Strtran(m.kk,'_',':') kk = Strtran(m.kk,'_l_','(') kk = Strtran(m.kk,'_r_',')') kk = Strtran(m.kk,'_h_','-') kk = Strtran(m.kk,'_d_','.') kk = Strtran(m.kk,m.tr,'_') Return m.kk *------------------------------- Function escapar(valor) *------------------------------- If Len(Chrtran(m.valor,["'<>&],'')) # Len(m.valor) valor = Strtran(m.valor,[&],[&]) valor = Strtran(m.valor,['],[']) valor = Strtran(m.valor,[<],[<]) valor = Strtran(m.valor,[>],[>]) valor = Strtran(m.valor,["],["]) Endif Return m.valor *------------------------------------------------------ Procedure valorAxml( vari, valor , atributos , nivel ) *------------------------------------------------------ m.xtag = Lower(xtag(m.vari)) Do Case Case Lower(m.vari) == NODETEXTTAG m.cxml = m.cxml+m.crlf+m.nivel+escapar(Transform(m.valor)) Case !atributos m.cxml = m.cxml+m.crlf+m.nivel+'<'+m.xtag+'>'+escapar(Transform(m.valor))+'' Otherwise m.cxml = m.cxml+' '+m.xtag+'="'+escapar(Transform(m.valor))+'"' Endcase