On Fri, Aug 22, 2014 at 08:34:37AM +0200, Iñigo Martínez wrote: > 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 ?
Depends on a variety of things I don't know like if your tree is always that simple, how much/often do you save, if you can reuse the ctx, if you can hook the ctx to your I/O, etc ... If the goal is purely to save to ram and discard it, yes it looks simpler You asked a question "how to save a doc without the XMLDecl ?", I answered, that's all ! Daniel > > 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/ -- 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