#include "libxml/parser.h" #include "libxml/xmlsave.h" xmlDocPtr simple_create(xmlChar* localname, xmlChar* prefix, xmlChar* ns) { xmlDocPtr doc = xmlNewDoc(0); if (doc && localname) { xmlNodePtr rootnode = xmlNewChild((xmlNodePtr)doc, 0, localname, 0); if (rootnode && ns) { xmlNsPtr nsnode = xmlNewNs(rootnode, ns, prefix); if (nsnode) { xmlSetNs(rootnode, nsnode); } } } return doc; } void simple_test(char* localname, char* prefix, char* ns) { xmlDocPtr doc = simple_create((xmlChar*)localname, (xmlChar*)prefix, (xmlChar*)ns); if (doc) { xmlSaveCtxtPtr savectxt = xmlSaveToFd(1, 0, XML_SAVE_NO_DECL); if (savectxt) { xmlSaveDoc(savectxt, doc); xmlSaveClose(savectxt); } xmlFreeDoc(doc); } } int main() { /* With prefix, fine */ simple_test("root", "xmp", "http://example.com/ns"); /* No prefix, fine */ simple_test("root", 0, "http://example.com/ns"); /* Empty prefix, bad! */ simple_test("root", "", "http://example.com/ns"); return 0; }