2 #include "fieldmapper_lookup.h"
4 static void _rest_xml_output(growing_buffer*, const jsonObject*, char*, int, int);
5 static char* _escape_xml (const char*);
7 char* json_string_to_xml(char* content) {
9 growing_buffer * res_xml;
12 obj = json_parse_string( content );
17 res_xml = buffer_init(1024);
18 buffer_add(res_xml, "<response>");
20 if(obj->type == JSON_ARRAY ) {
21 for( i = 0; i!= obj->size; i++ ) {
22 _rest_xml_output(res_xml, jsonObjectGetIndex(obj,i), NULL, 0,0);
25 _rest_xml_output(res_xml, obj, NULL, 0,0);
28 buffer_add(res_xml, "</response>");
31 return buffer_release(res_xml);
34 char* _escape_xml (const char* text) {
35 growing_buffer* b = buffer_init(256);
36 int len = strlen(text);
38 for (i = 0; i < len; i++) {
40 buffer_add(b,"&");
41 else if (text[i] == '<')
43 else if (text[i] == '>')
46 buffer_add_char(b,text[i]);
48 return buffer_release(b);
51 static void _rest_xml_output(growing_buffer* buf, const jsonObject* obj,
52 char * obj_class, int arr_index, int notag) {
61 if(isFieldmapper(obj_class)) {
62 tag = fm_pton(obj_class,arr_index);
63 } else if(obj_class) {
64 tag = strdup(obj_class);
66 tag = strdup("datum");
70 /* add class hints if we have a class name */
72 if(obj->type == JSON_NULL) {
73 buffer_fadd(buf,"<%s><Object class_hint=\"%s\"/></%s>", tag, obj->classname, tag);
77 buffer_fadd(buf,"<%s><Object class_hint=\"%s\">", tag, obj->classname);
82 /* now add the data */
83 if(obj->type == JSON_NULL) {
85 buffer_fadd(buf, "<%s/>",tag);
86 } else if(obj->type == JSON_BOOL && obj->value.b) {
88 buffer_add(buf, "true");
90 buffer_fadd(buf, "<%s>true</%s>",tag,tag);
92 } else if(obj->type == JSON_BOOL && ! obj->value.b) {
94 buffer_add(buf, "false");
96 buffer_fadd(buf, "<%s>false</%s>",tag,tag);
98 } else if (obj->type == JSON_STRING) {
100 char * t = _escape_xml(jsonObjectGetString(obj));
104 char * t = _escape_xml(jsonObjectGetString(obj));
105 buffer_fadd(buf,"<%s>%s</%s>",tag,t,tag);
109 } else if(obj->type == JSON_NUMBER) {
110 double x = jsonObjectGetNumber(obj);
113 buffer_fadd(buf,"%d",(int)x);
115 buffer_fadd(buf,"%f",x);
118 buffer_fadd(buf,"<%s>%d</%s>",tag, (int)x,tag);
120 buffer_fadd(buf,"<%s>%f</%s>",tag, x,tag);
123 } else if (obj->type == JSON_ARRAY) {
125 if(!isFieldmapper(obj_class))
126 buffer_add(buf,"<array>");
128 buffer_fadd(buf,"<%s>",tag);
131 for( i = 0; i!= obj->size; i++ ) {
132 _rest_xml_output(buf, jsonObjectGetIndex(obj,i), obj->classname, i,0);
136 if(!isFieldmapper(obj_class))
137 buffer_add(buf,"</array>");
139 buffer_fadd(buf,"</%s>",tag);
142 } else if (obj->type == JSON_HASH) {
146 buffer_add(buf,"<hash>");
148 buffer_fadd(buf,"<%s>",tag);
151 jsonObjectIterator* itr = jsonNewObjectIterator(obj);
153 while( (tmp = jsonObjectIteratorNext(itr)) ) {
155 buffer_fadd(buf,"<%s>",tmp->key);
157 buffer_add(buf,"<pair>");
158 buffer_fadd(buf,"<key>%s</key><value>",tmp->key);
161 _rest_xml_output(buf, tmp->item, NULL,0,notag);
164 buffer_fadd(buf,"</%s>",tmp->key);
166 buffer_add(buf,"</value></pair>");
169 jsonObjectIteratorFree(itr);
173 buffer_add(buf,"</hash>");
175 buffer_fadd(buf,"</%s>",tag);
181 buffer_fadd(buf,"</Object></%s>",tag);