Boost logo

Boost :

From: Nils Springob (nils.springob_at_[hidden])
Date: 2006-09-07 12:13:13


Hi ,

Perhaps you can get some additional ideas from my xml lib, it's not
finished yet, but it already works. You can download it here:

http://download.nicai-systems.com/xmlpp/xmlpp.tar.gz

I am using my library to transmit data over a tcp stream (wrapped in an
std::istream and an std::ostream), load and store measurement data and
for handling configuration data in xml-files.
I wrote a class generator which generates derived xml element nodes. The
generator itself uses the library, and generates it's own source code ;-)

I started developing an xml-library for c++ because the existing
libraries did not fit my taste. I think they are written for other
languages than c++: DOM and SAX are good and nice for java and .net
applications. Libxml is to big, and TinyXml supports only the DOM
interface...

When I use xml, I can ensure that everything is coded in UTF-8, so it
would be possible to work with char based std::streams and std::strings,
and if the file would be coded in "real Unicode", there would be the
possibility to use the wchar based classes.

My design of the library has 3 different layers:

The requirements for the fist (tag based) layer were (demo1):
  - Compatibility with std::istream and std::ostream
  - Extremely lightweight, not a huge xml framework...

The requirements for the second layer were (demo2):
  - Access to an element tree, which may contain a whole xml document or
a part of it.
  - The parser can load the whole document, or a single element with or
without it's contents.

The requirement for the third layer were (demo3 and xclassgen):
  - Access to the elements of the tree by derived classes which can be
automatically generated by an xml:schema definition file.

The current limitations of the library are:
- no encoding support, but UTF-8 can be handled with std::string
- no namespaces, but it should be possible to change this...
- the automatic generation of the derived classes needs at the moment a
special xml definition file, it does not work with the xml:schema file

Loading an xml document is always done by a pull parser based on an
std::istream, pushing will be handled by using a thread wrapped around
the pull parser (so there is no need to use an self made stack....)

std::ifstream in("test.xml");
xml::ixmlstream xin(in);
while(true)
{
   xml::node n = xin.getNextNode();
   if (n==0) break;
   handle(n);
   delete n;
}

Regards,
Nils


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk