diff -r ab9c5afdc243 -r 604e7e335b3b libidav/xml.c --- 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, "", prefix, node->name); + if(prefix) { + ucx_fprintf(stream, writef, "", prefix, node->name); + } else { + ucx_fprintf(stream, writef, "", 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; +}