Re: [xml] How to retrieve filename from xmlTextWriter



Hi Daniel,
thank you!

That's clear - unfortunately...
I was hoping it'd be kept handy.
Oh well, it's never that easy... ;-)

Best regards: Zoltán Ördögh


On Thu, Mar 14, 2013 at 10:22 PM, Daniel Veillard <veillard redhat com> wrote:
On Thu, Mar 14, 2013 at 07:12:34PM -0400, Zoltán Ördögh (GMail) wrote:
> Hi all,
> I am exporting data from binary format to XML.
> Most of the data fits nicely into the XML document, it looks nice, tidy and
> easy to read.
>
> However, there are a few large blocks of data. For example, 4k floats is
> not very useful as a BASE64 encoded string, and having 4k elements is not
> very useful, neither.
> So, I thought I'd export these blocks 'as-is', into binary format, as a
> separate file, right next to the XML file and store the location on the
> binary file into the XML instead.
>
> To achieve this, I'd need to find out the URI of the XML file being written
> (so I can change the file extension from XML to BIN and write the file to
> the same place where the XML is).
> Unfortunately, the xmlTextWriter does not have any members that would give
> me the URI.
>
> Is there any legitimate way to figure it out - one that I must have missed?
>
> The thing is, I would not want to update all classes involved just to pass
> down the URI of the XML document; it would be far better go get the
> filename on the spot, using the xmlTextWriterPtr that's already passed down.

  But you can use a writer to a file descriptor, or any method of I/O
you want to build.
  xmlNewTextWriterFilename()
calls
  __xmlOutputBufferCreateFilename(const char *URI,...
and there we use the I/O layer to create a context used by the
I/O layer to push data, but that context is completely opaque
and at the xmlOutputBuffer level we don't keep informations like
the URI

http://xmlsoft.org/html/libxml-tree.html#xmlOutputBuffer
-------------------------------
struct _xmlOutputBuffer {
    void*                   context;
    xmlOutputWriteCallback  writecallback;
    xmlOutputCloseCallback  closecallback;

    xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */

    xmlBufPtr buffer;    /* Local buffer encoded in UTF-8 or ISOLatin */
    xmlBufPtr conv;      /* if encoder != NULL buffer for output */
    int written;            /* total number of byte written */
    int error;
};
-------------------------------

  So as-is, I'm sorry that's not possible, you will have somehow
to keep the data around, as libxml2 doesn't store it there.
Another way would be to design and register your own I/O layer for
file access and store that filename as part of the returned context
used by your own I/O routines.

Daniel

--
Daniel Veillard      | Open Source and Standards, Red Hat
veillard redhat com  | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | virtualization library  http://libvirt.org/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]