2 #include "fieldmapper_lookup.h"
4 void _rest_xml_output(growing_buffer*, jsonObject*, char*, int, int);
5 char* _escape_xml (char*);
7 char* json_string_to_xml(char* content) {
9 growing_buffer * res_xml;
13 obj = json_parse_string( content );
14 res_xml = buffer_init(1024);
19 buffer_add(res_xml, "<response>");
21 if(obj->type == JSON_ARRAY ) {
22 for( i = 0; i!= obj->size; i++ ) {
23 _rest_xml_output(res_xml, jsonObjectGetIndex(obj,i), NULL, 0,0);
26 _rest_xml_output(res_xml, obj, NULL, 0,0);
29 buffer_add(res_xml, "</response>");
31 output = buffer_data(res_xml);
38 char* _escape_xml (char* text) {
40 growing_buffer* b = buffer_init(256);
41 int len = strlen(text);
43 for (i = 0; i < len; i++) {
45 buffer_add(b,"&");
46 else if (text[i] == '<')
48 else if (text[i] == '>')
51 buffer_add_char(b,text[i]);
58 void _rest_xml_output(growing_buffer* buf, jsonObject* obj, char * obj_class, int arr_index, int notag) {
67 if(isFieldmapper(obj_class)) {
68 tag = fm_pton(obj_class,arr_index);
69 } else if(obj_class) {
70 tag = strdup(obj_class);
72 tag = strdup("datum");
76 /* add class hints if we have a class name */
78 if(obj->type == JSON_NULL) {
79 buffer_fadd(buf,"<%s><Object class_hint=\"%s\"/></%s>", tag, obj->classname, tag);
82 buffer_fadd(buf,"<%s><Object class_hint=\"%s\">", tag, obj->classname);
87 /* now add the data */
88 if(obj->type == JSON_NULL) {
90 buffer_fadd(buf, "<%s/>",tag);
91 } else if(obj->type == JSON_BOOL && obj->value.b) {
93 buffer_add(buf, "true");
95 buffer_fadd(buf, "<%s>true</%s>",tag,tag);
97 } else if(obj->type == JSON_BOOL && ! obj->value.b) {
99 buffer_add(buf, "false");
101 buffer_fadd(buf, "<%s>false</%s>",tag,tag);
103 } else if (obj->type == JSON_STRING) {
105 char * t = _escape_xml(jsonObjectGetString(obj));
109 char * t = _escape_xml(jsonObjectGetString(obj));
110 buffer_fadd(buf,"<%s>%s</%s>",tag,t,tag);
114 } else if(obj->type == JSON_NUMBER) {
115 double x = jsonObjectGetNumber(obj);
118 buffer_fadd(buf,"%d",tag, (int)x,tag);
120 buffer_fadd(buf,"%lf",tag, x,tag);
123 buffer_fadd(buf,"<%s>%d</%s>",tag, (int)x,tag);
125 buffer_fadd(buf,"<%s>%lf</%s>",tag, x,tag);
128 } else if (obj->type == JSON_ARRAY) {
130 if(!isFieldmapper(obj_class))
131 buffer_add(buf,"<array>");
133 buffer_fadd(buf,"<%s>",tag);
136 for( i = 0; i!= obj->size; i++ ) {
137 _rest_xml_output(buf, jsonObjectGetIndex(obj,i), obj->classname, i,0);
141 if(!isFieldmapper(obj_class))
142 buffer_add(buf,"</array>");
144 buffer_fadd(buf,"</%s>",tag);
147 } else if (obj->type == JSON_HASH) {
151 buffer_add(buf,"<hash>");
153 buffer_fadd(buf,"<%s>",tag);
156 jsonObjectIterator* itr = jsonNewObjectIterator(obj);
158 while( (tmp = jsonObjectIteratorNext(itr)) ) {
160 buffer_fadd(buf,"<%s>",tmp->key);
162 buffer_add(buf,"<pair>");
163 buffer_fadd(buf,"<key>%s</key><value>",tmp->key);
166 _rest_xml_output(buf, tmp->item, NULL,0,notag);
169 buffer_fadd(buf,"</%s>",tmp->key);
171 buffer_add(buf,"</value></pair>");
174 jsonObjectIteratorFree(itr);
178 buffer_add(buf,"</hash>");
180 buffer_fadd(buf,"</%s>",tag);
186 buffer_fadd(buf,"</Object></%s>",tag);