Yeah, it's ok, and the answer is totally valid. I only wondered if my approach had any known drawback.
Thank you very much :) 2014-08-22 9:16 GMT+02:00 Daniel Veillard <veill...@redhat.com>: > 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