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