... and more interesting. I am past the set-up phase and I got to the point of building a SAX parser (I have not figured out yet what is the practical difference between SAX and StAX). My beef with XML is obviously increasing :) But let's not go there. Here is my thinking. I write SAX:START-ELEMENT methods and let each one of them look like (defmethod sax:start-element ((h smbl-handler) namespace-uri (local-name (equal "model")) qname attributes) ...) (defmethod sax:start-element ((h smbl-handler) namespace-uri (local-name (equal "compartment")) qname attributes) ...) You get the idea... Of course, we don't have EQUAL specializers (and I don't want to depend on "predicate dispatching" extensions :) ) so I did the following trick. (defclass sbml-parser (sax:sax-parser) ; Why do I need this? () ) (defclass sbml-handler (sax:default-handler) ((source :reader sbml-handler-source :initarg :source) (pathname :reader sbml-handler-pathname :initarg :pathname) ) ) (defclass sbml-symbolizer (cxml:sax-proxy) ()) ... and ... (defmethod sax:start-element ((h sbml-symbolizer) namespace-uri local-name qname attributes) (sax:start-element (cxml:proxy-chained-handler h) (intern namespace-uri) (intern local-name) (intern qname) attributes) ) So now I can write (defmethod sax:start-element ((h smbl-handler) (namespace-uri (eql '|http://www.smbl.org/sbml/level2/version4|)) (local-name (eql '|compartment|)) qname attributes) ...) apart from the details... Do you guys think this is a sensible approach? It'd make writing the SAX parser a cinch. Thanks -- Marco Antoniotti