Listing 2: PersonnelHandler implements the active graph for the personnel schema.
// This class implements all facets needed to handle a personnel XML document.
class PersonnelHandler : private IXMLDocumentHandler
{
private:
mapIDToPerson &m_people;
std::string m_id;
Person m_current;
// One facet for each element type.
FXMLElementHandler< PersonnelHandler > f_personnel;
FXMLElementHandler< PersonnelHandler > f_person;
FXMLElementHandler< PersonnelHandler > f_name;
FXMLElementHandler< PersonnelHandler > f_familyName;
FXMLElementHandler< PersonnelHandler > f_givenName;
FXMLElementHandler< PersonnelHandler > f_email;
FXMLElementHandler< PersonnelHandler > f_web;
FXMLElementHandler< PersonnelHandler > f_workWeb;
FXMLElementHandler< PersonnelHandler > f_familyWeb;
FXMLElementHandler< PersonnelHandler > f_link;
// Default methods shared by many facets.
IXMLElementHandler *default_child(
const XMLCh *const name );
void default_start(
AttributeList &attrs ) {}
void default_end() {}
void default_characters(
const XMLCh *const chars,
const unsigned int length) {}
// Implementation of the document handler interface.
IXMLElementHandler *child( const XMLCh *const name );
void start() {}
void end() {}
void reset() {}
// Methods for specific facets.
void person_start( AttributeList &attrs );
void person_end();
IXMLElementHandler *personnel_child( const XMLCh *const name );
IXMLElementHandler *person_child( const XMLCh *const name );
IXMLElementHandler *name_child( const XMLCh *const name );
IXMLElementHandler *web_child( const XMLCh *const name );
void familyName_characters( const XMLCh *const chars,
const unsigned int length);
void givenName_characters( const XMLCh *const chars,
const unsigned int length);
void email_characters( const XMLCh *const chars,
const unsigned int length);
void workWeb_characters( const XMLCh *const chars,
const unsigned int length);
void familyWeb_characters( const XMLCh *const chars,
const unsigned int length);
void link_start( AttributeList &attrs );
public:
// Initialize all facets with pointers to member functions.
PersonnelHandler( mapIDToPerson &people ) :
m_people( people ),
f_personnel( this, personnel_child, default_start,
default_end, default_characters ),
f_person( this, person_child, person_start,
person_end, default_characters ),
f_name( this, name_child, default_start,
default_end, default_characters ),
f_familyName( this, default_child, default_start,
default_end, familyName_characters ),
f_givenName( this, default_child, default_start,
default_end, givenName_characters ),
f_email( this, default_child, default_start,
default_end, email_characters ),
f_web( this, web_child, default_start,
default_end, default_characters ),
f_workWeb( this, default_child, default_start,
default_end, workWeb_characters ),
f_familyWeb( this, default_child, default_start,
default_end, familyWeb_characters ),
f_link( this, default_child, link_start,
default_end, default_characters )
{}
void parse( const char * const systemID );
};
void PersonnelHandler::parse( const char * const systemID )
{
XMLInterpreter interpreter( this );
interpreter.parse( systemID );
}