libidav/xml.c

changeset 371
604e7e335b3b
parent 361
b6f2462ee055
child 373
dcc03142eb5f
--- a/libidav/xml.c	Sun Feb 04 12:36:26 2018 +0100
+++ b/libidav/xml.c	Sun Feb 04 15:58:07 2018 +0100
@@ -140,28 +140,37 @@
 void dav_print_node(void *stream, write_func writef, UcxMap *nsmap, DavXmlNode *node) {
     while(node) {
         if(node->type == DAV_XML_ELEMENT) {
-            char *prefix = ucx_map_cstr_get(nsmap, node->namespace);
             char *tagend = node->children ? ">" : " />";
-            if(!prefix) {
-                sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count);
-                ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr);
-                prefix = newpre.ptr;
-                ucx_fprintf(
-                        stream,
-                        writef,
-                        "<%s:%s xmlns:%s=\"%s\"%s",
-                        prefix,
-                        node->name,
-                        prefix,
-                        node->namespace,
-                        tagend);
+            char *prefix = NULL;
+            if(node->namespace) {
+                prefix = ucx_map_cstr_get(nsmap, node->namespace);
+                if(!prefix) {
+                    sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count);
+                    ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr);
+                    prefix = newpre.ptr;
+                    ucx_fprintf(
+                            stream,
+                            writef,
+                            "<%s:%s xmlns:%s=\"%s\"%s",
+                            prefix,
+                            node->name,
+                            prefix,
+                            node->namespace,
+                            tagend);
+                } else {
+                    ucx_fprintf(stream, writef, "<%s:%s%s", prefix, node->name, tagend);
+                }
             } else {
-                ucx_fprintf(stream, writef, "<%s:%s%s", prefix, node->name, tagend);
+                ucx_fprintf(stream, writef, "<%s%s", node->name, tagend);
             }
             
             if(node->children) {
                 dav_print_node(stream, writef, nsmap, node->children);
-                ucx_fprintf(stream, writef, "</%s:%s>", prefix, node->name);
+                if(prefix) {
+                    ucx_fprintf(stream, writef, "</%s:%s>", prefix, node->name);
+                } else {
+                    ucx_fprintf(stream, writef, "</%s>", node->name);
+                }
             }
         } else if(node->type == DAV_XML_TEXT) {
             writef(node->content, 1, node->contentlength, stream);
@@ -275,3 +284,18 @@
         node->children = child;
     }
 }
+
+DavXmlNode* dav_parse_xml(DavSession *sn, const char *str, size_t len) {
+    xmlDoc *doc = xmlReadMemory(str, len, NULL, NULL, 0);
+    if(!doc) {
+        return NULL;
+    }
+    xmlNode *xml_root = xmlDocGetRootElement(doc);
+    if(!xml_root) {
+        xmlFreeDoc(doc);
+        return NULL;
+    }
+    DavXmlNode *x = dav_convert_xml(sn, xml_root);
+    xmlFreeDoc(doc);
+    return x;
+}

mercurial