libidav/xml.c

changeset 371
604e7e335b3b
parent 361
b6f2462ee055
child 373
dcc03142eb5f
equal deleted inserted replaced
370:ab9c5afdc243 371:604e7e335b3b
138 } 138 }
139 139
140 void dav_print_node(void *stream, write_func writef, UcxMap *nsmap, DavXmlNode *node) { 140 void dav_print_node(void *stream, write_func writef, UcxMap *nsmap, DavXmlNode *node) {
141 while(node) { 141 while(node) {
142 if(node->type == DAV_XML_ELEMENT) { 142 if(node->type == DAV_XML_ELEMENT) {
143 char *prefix = ucx_map_cstr_get(nsmap, node->namespace);
144 char *tagend = node->children ? ">" : " />"; 143 char *tagend = node->children ? ">" : " />";
145 if(!prefix) { 144 char *prefix = NULL;
146 sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count); 145 if(node->namespace) {
147 ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr); 146 prefix = ucx_map_cstr_get(nsmap, node->namespace);
148 prefix = newpre.ptr; 147 if(!prefix) {
149 ucx_fprintf( 148 sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count);
150 stream, 149 ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr);
151 writef, 150 prefix = newpre.ptr;
152 "<%s:%s xmlns:%s=\"%s\"%s", 151 ucx_fprintf(
153 prefix, 152 stream,
154 node->name, 153 writef,
155 prefix, 154 "<%s:%s xmlns:%s=\"%s\"%s",
156 node->namespace, 155 prefix,
157 tagend); 156 node->name,
157 prefix,
158 node->namespace,
159 tagend);
160 } else {
161 ucx_fprintf(stream, writef, "<%s:%s%s", prefix, node->name, tagend);
162 }
158 } else { 163 } else {
159 ucx_fprintf(stream, writef, "<%s:%s%s", prefix, node->name, tagend); 164 ucx_fprintf(stream, writef, "<%s%s", node->name, tagend);
160 } 165 }
161 166
162 if(node->children) { 167 if(node->children) {
163 dav_print_node(stream, writef, nsmap, node->children); 168 dav_print_node(stream, writef, nsmap, node->children);
164 ucx_fprintf(stream, writef, "</%s:%s>", prefix, node->name); 169 if(prefix) {
170 ucx_fprintf(stream, writef, "</%s:%s>", prefix, node->name);
171 } else {
172 ucx_fprintf(stream, writef, "</%s>", node->name);
173 }
165 } 174 }
166 } else if(node->type == DAV_XML_TEXT) { 175 } else if(node->type == DAV_XML_TEXT) {
167 writef(node->content, 1, node->contentlength, stream); 176 writef(node->content, 1, node->contentlength, stream);
168 } 177 }
169 178
273 child->prev = last_child; 282 child->prev = last_child;
274 } else { 283 } else {
275 node->children = child; 284 node->children = child;
276 } 285 }
277 } 286 }
287
288 DavXmlNode* dav_parse_xml(DavSession *sn, const char *str, size_t len) {
289 xmlDoc *doc = xmlReadMemory(str, len, NULL, NULL, 0);
290 if(!doc) {
291 return NULL;
292 }
293 xmlNode *xml_root = xmlDocGetRootElement(doc);
294 if(!xml_root) {
295 xmlFreeDoc(doc);
296 return NULL;
297 }
298 DavXmlNode *x = dav_convert_xml(sn, xml_root);
299 xmlFreeDoc(doc);
300 return x;
301 }

mercurial