It looks like a longer way. I mean, with the new saving API there is one more variable and one more function call, plus the creation of the full document, instead of using only just the nodes. Some code snippets.
Using the saving API: xmlDocPtr doc; xmlNodePtr node; xmlBufferPtr buffer; xmlSaveCtxtPtr ctx; doc = xmlNewDoc (NULL); node = xmlNewNode (NULL, BAD_CAST "Command"); xmlDocSetRootElement (doc, node); xmlNewProp(node, BAD_CAST "Timestamp", BAD_CAST "0"); xmlNewProp(node, BAD_CAST "ReceptionTimestamp", BAD_CAST "0"); xmlNewProp(node, BAD_CAST "Sender", BAD_CAST "P1"); xmlNewProp(node, BAD_CAST "Receiver", BAD_CAST "P2"); xmlNewChild(node, NULL, BAD_CAST "GetData", NULL); buffer = xmlBufferCreate (); ctx = xmlSaveToBuffer (buffer, NULL, XML_SAVE_NO_DECL); if (xmlSaveDoc (ctx, doc) == -1) { fprintf (stderr, "Error saving buffer\n"); return; } xmlBufferFree (buffer); Using xmlNodeDump: xmlNodePtr node; xmlBufferPtr buffer; node = xmlNewNode (NULL, BAD_CAST "Command"); xmlNewProp (node, BAD_CAST "Timestamp", BAD_CAST "0"); xmlNewProp (node, BAD_CAST "ReceptionTimestamp", BAD_CAST "0"); xmlNewProp (node, BAD_CAST "Sender", BAD_CAST "P1"); xmlNewProp (node, BAD_CAST "Receiver", BAD_CAST "P2"); xmlNewChild (node, NULL, BAD_CAST "GetData", NULL); buffer = xmlBufferCreate (); if (xmlNodeDump(buffer, NULL, cmd, 0, 0) == -1) { fprintf (stderr, "Error saving buffer\n"); return; } xmlBufferFree (buffer); Is there any benefit on using the new saving API ? 2014-08-22 6:34 GMT+02:00 Daniel Veillard <veill...@redhat.com>: > On Wed, Aug 20, 2014 at 07:04:06PM +0200, Iñigo Martínez wrote: >> Hi: >> >> I'm working with a protocol based on XML, something like: >> >> <Command Timestamp="0" ReceptionTimeStamp="0" Sender="P1" >> Receiver="P2"><GetData/></Command> >> >> I can successfully parse these messages using xmlReadMemory and >> navigating through the tree. When trying to create my own messages I >> can create them successfully this way: >> >> doc = xmlNewDoc(NULL); >> node = xmlNewNode(NULL, BAD_CAST "Command"); >> xmlDocSetRootElement(doc, node); >> >> xmlNewProp(node, BAD_CAST "Timestamp", BAD_CAST "0"); >> xmlNewProp(node, BAD_CAST "ReceptionTimestamp", BAD_CAST "0"); >> xmlNewProp(node, BAD_CAST "Sender", BAD_CAST "P1"); >> xmlNewProp(node, BAD_CAST "Receiver", BAD_CAST "P2"); >> >> xmlNewChild(node, NULL, BAD_CAST "GetData", NULL); >> >> The problem comes when trying to get the correspondant string as I get >> the xml version in the output: >> >> <?xml version="1.0"?><Command Timestamp="0" ReceptionTimeStamp="0" >> Sender="P1" Receiver="P2"><GetData/></Command> >> >> I have seen some tricks using a xmlTextWriter, but in my case I need >> an string not a file. >> >> Is there any way to avoid it ? > > Best way is to use the 'new' saving APIs > > http://xmlsoft.org/html/libxml-xmlsave.html#xmlSaveToBuffer > with XML_SAVE_NO_DECL in the option > > and use > http://xmlsoft.org/html/libxml-xmlsave.html#xmlSaveDoc > > if you are piling up such messages on an IO just use anothe xmlSaveTo... > function and Flush to output instead of writing in memory and doing > the I/O separately > > Daniel > > -- > Daniel Veillard | Open Source and Standards, Red Hat > veill...@redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ > http://veillard.com/ | virtualization library http://libvirt.org/ _______________________________________________ xml mailing list, project page http://xmlsoft.org/ xml@gnome.org https://mail.gnome.org/mailman/listinfo/xml