Guardando aqui, lá do forum Harbour users.
The usage:
--------------
LOCAL cJsonString := [{ "FName" : "Pritpal", "LName" : "Bedi" }]
LOCAL hData := hb_jsonDecode( cJsonString )
LOCAL cXml := hb_hashToXml( hData )
// Do whatever you want with cXml
RETURN lSuccess
DEPENDANCY
===========
hbmxml.hbc
CONVERSION CODE by Prezemek
----------------------------- ===========
FUNCTION hb_hashToXML( hValue, n, cEOL )
LOCAL cXML
IF valtype( n ) != "N"
n := -2
ENDIF
IF cEOL == NIL
cEOL := iif( n >= -1, hb_eol(), "" )
ENDIF
cXML := hb_XML_savenodes( hValue, n, cEOL )
RETURN '<?xml version="1.0" encoding="UTF-8"?>' + hb_eol() + hb_strToUtf8( cXML ) + hb_eol()
STATIC FUNCTION hb_XML_savenodes( hValue, n, cEOL )
LOCAL cXML := "", v, e, x, n2
n2 := iif( n < 0, n, n + 2 )
for each v in hValue
SWITCH valtype( v )
CASE "C"
CASE "M"
x := v
EXIT
CASE "N"
x := hb_ntos( v )
EXIT
CASE "D"
x := dtos( v )
EXIT
CASE "T"
x := hb_tstostr( v )
EXIT
CASE "L"
x := iif( v, "true", "false" )
EXIT
CASE "H"
cXML += space( n ) + "<" + v:__enumKey() + ">" + cEOL
cXML += hb_XML_savenodes( v, n2, cEOL )
cXML += space( n ) + "</" + hb_XML_endtag( v:__enumKey() ) + ">" + cEOL
x := NIL
EXIT
CASE "A"
FOR EACH e IN v
cXML += space( n ) + "<" + v:__enumKey() + ">" + cEOL
cXML += hb_XML_savenodes( e, n2, cEOL )
cXML += space( n ) + "</" + hb_XML_endtag( v:__enumKey() ) + ">" + cEOL
next
x := NIL
EXIT
OTHERWISE
x := NIL
ENDSWITCH
IF x != NIL
cXML += space( n ) + "<" + v:__enumKey() + ">"
cXML += x
cXML += "</" + hb_XML_endtag( v:__enumKey() ) + ">" + cEOL
ENDIF
next
RETURN cXML
STATIC FUNCTION hb_XML_endtag( cTag )
LOCAL n := at( " ", cTag )
IF n != 0
cTag := left( cTag, n - 1 )
ENDIF
RETURN cTag
FUNCTION hb_XMLtoHash( cXML, lOmitHeader )
LOCAL pXML
hb_default( @lOmitHeader, .T. )
pXML := mxmlLoadString( NIL, hb_utf8ToStr( cXML ), MXML_OPAQUE_CALLBACK )
IF !empty( pXML )
IF lOmitHeader
RETURN hb_XML_getnodes( mxmlGetFirstChild( pXML ) )
ELSE
RETURN hb_XML_getnodes( pXML )
ENDIF
ENDIF
RETURN NIL
STATIC FUNCTION hb_XML_getnodes( pNode )
LOCAL cKey, pChild, xResult, xValue, aValue
WHILE !empty( pNode )
IF mxmlGetType( pNode ) == MXML_ELEMENT
cKey := mxmlGetElement( pNode )
pChild := mxmlGetFirstChild( pNode )
xValue := hb_XML_getnodes( pChild )
IF xValue == NIL
xValue := mxmlGetOpaque( pNode )
ENDIF
IF xResult == NIL
xResult := {=>}
hb_hKeepOrder( xResult, .t. )
xResult[ cKey ] := xValue
ELSEIF cKey $ xResult
aValue := xResult[ cKey ]
IF !hb_isArray( aValue )
aValue := { aValue }
xResult[ cKey ] := aValue
ENDIF
aadd( aValue, xValue )
ELSE
xResult[ cKey ] := xValue
ENDIF
ENDIF
pNode := mxmlGetNextSibling( pNode )
ENDDO
RETURN xResult
De XML para Json
Again...
To convert an xml string to json ....
hJson := hb_xmlToHash( cXmlString )
cJson := hb_jsonEncode( hJson, .T. ) // .T. == format with 3 spaces indentation. .F. == No indentation. One lng string.
Hb_JsonEncode() and hb_JsonDecode() are Harbour functions. hb_xmlToHash() and hb_hashToXML() are developed by Przemek and were published in this group many years back.
Hope it would be helpful for you and many others.
Pritpal Bedi
a student of software analysis & concepts
Saudações,
Itamar M. Lins Jr.