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

Reply via email to