4 static char* _escape_xml (char*);
5 static int _recurse_jsonObjectToXML(jsonObject*, growing_buffer*);
7 char* jsonObjectToXML(jsonObject* obj) {
9 growing_buffer * res_xml;
12 res_xml = buffer_init(1024);
15 return strdup("<null/>");
17 _recurse_jsonObjectToXML( obj, res_xml );
18 output = buffer_data(res_xml);
26 int _recurse_jsonObjectToXML(jsonObject* obj, growing_buffer* res_xml) {
29 char * bool_val = NULL;
33 hint = strdup(obj->classname);
35 if(obj->type == JSON_NULL) {
38 buffer_fadd(res_xml, "<null class_hint=\"%s\"/>",hint);
40 buffer_add(res_xml, "<null/>");
42 } else if(obj->type == JSON_BOOL) {
45 bool_val = strdup("true");
47 bool_val = strdup("false");
50 buffer_fadd(res_xml, "<boolean value=\"%s\" class_hint=\"%s\"/>", bool_val, hint);
52 buffer_fadd(res_xml, "<boolean value=\"%s\"/>", bool_val);
56 } else if (obj->type == JSON_STRING) {
58 char * t = _escape_xml(jsonObjectGetString(obj));
59 buffer_fadd(res_xml,"<string class_hint=\"%s\">%s</string>", hint, t);
62 char * t = _escape_xml(jsonObjectGetString(obj));
63 buffer_fadd(res_xml,"<string>%s</string>", t);
67 } else if(obj->type == JSON_NUMBER) {
68 double x = jsonObjectGetNumber(obj);
71 buffer_fadd(res_xml,"<number class_hint=\"%s\">%d</number>", hint, (int)x);
73 buffer_fadd(res_xml,"<number class_hint=\"%s\">%lf</number>", hint, x);
76 buffer_fadd(res_xml,"<number>%d</number>", (int)x);
78 buffer_fadd(res_xml,"<number>%lf</number>", x);
81 } else if (obj->type == JSON_ARRAY) {
84 buffer_fadd(res_xml,"<array class_hint=\"%s\">", hint);
86 buffer_add(res_xml,"<array>");
88 for ( i = 0; i!= obj->size; i++ )
89 _recurse_jsonObjectToXML(jsonObjectGetIndex(obj,i), res_xml);
91 buffer_add(res_xml,"</array>");
93 } else if (obj->type == JSON_HASH) {
96 buffer_fadd(res_xml,"<object class_hint=\"%s\">", hint);
98 buffer_add(res_xml,"<object>");
100 jsonObjectIterator* itr = jsonNewObjectIterator(obj);
102 while( (tmp = jsonObjectIteratorNext(itr)) ) {
104 buffer_fadd(res_xml,"<element key=\"%s\">",tmp->key);
106 _recurse_jsonObjectToXML(tmp->item, res_xml);
108 buffer_add(res_xml,"</element>");
110 jsonObjectIteratorFree(itr);
112 buffer_add(res_xml,"</object>");
121 char* _escape_xml (char* text) {
123 growing_buffer* b = buffer_init(256);
124 int len = strlen(text);
126 for (i = 0; i < len; i++) {
128 buffer_add(b,"&");
129 else if (text[i] == '<')
130 buffer_add(b,"<");
131 else if (text[i] == '>')
132 buffer_add(b,">");
134 buffer_add_char(b,text[i]);
136 out = buffer_data(b);