Clipper On Line • Ver Tópico - Json para XML

Json para XML

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Json para XML

Mensagempor Itamar M. Lins Jr. » 03 Set 2020 18:03

Ola!
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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro