RFC: "even simpler" C++ XML parser for object hierarchies

Paul Miller stele at fxtech.com
Wed Dec 8 15:23:44 GMT 1999


> Is holding the document in memory not an option?  Because if you can hold
> it all in memory, it's simple enough to build a tree representation of the
> thing, then walk the tree with your handlers, then throw away the tree.

I started thinking about this some more. If I could build a light-weight
in-memory representation of the XML file, then I could build an "even
simpler" DOM-like interface as an option. So if you didn't want to use
the callback-based "discovery" API that I outlined previously, you can
use an alternative iterator-based API that lets you avoid the callbacks
and just iterate over elements you are interested in.

Here is my previous code, rewritten for a similar iterator-based API. As
you can see, it avoids the static callback functions and a lot of the
extra boiler-plate code, but the API is very similar.

Thoughts?

Document *App::LoadDocument(const char *path)
{	
	XML::Input file(path);
	XML::Element elem = file.GetElement("Document");
	Document *doc = new Document(elem.GetAttribute("name"));
	// now iterate over 'Layer' elements
	XML::Element::iterator it;
	for (it = elem.begin("Layer"); it != elem.end(); ++it)
	{
		Layer *layer = new Layer((*it).GetAttribute("name"));
		layer->Parse(*it);
		doc->AddLayer(layer);
	}
	AddDocument(doc);
	return doc;
}

void Layer::Parse(XML::Element &elem)
{
	// look for (required) size element
	mSize.Parse(elem.GetElement("size"));
	// look for object elements
	XML::Element::iterator it;
	for (it = elem.begin("Object"); it != elem.end(); ++it)
	{
		Object *obj = ObjectFactory::Create((*it).GetAttribute("type"));
		obj->Parse(*it);
		AddObject(obj);
	}
}

void Size::Parse(XML::Element &elem)
{
	sscanf(elem.GetData(), "%dx%d", &width, &height);
}

--
Paul Miller - stele at fxtech.com

xml-dev: A list for W3C XML Developers. To post, mailto:xml-dev at ic.ac.uk
Archived as: http://www.lists.ic.ac.uk/hypermail/xml-dev/ and on CD-ROM/ISBN 981-02-3594-1
To unsubscribe, mailto:majordomo at ic.ac.uk the following message;
unsubscribe xml-dev
To subscribe to the digests, mailto:majordomo at ic.ac.uk the following message;
subscribe xml-dev-digest
List coordinator, Henry Rzepa (mailto:rzepa at ic.ac.uk)





More information about the Xml-dev mailing list