📄 mperry.txt
字号:
Active Graphs & Facets
by Michael L. Perry
Listing 1:
class XMLInterpreter : private DocumentHandler
{
private:
// The document handler.
IXMLDocumentHandler *m_documentHandler;
// A stack of element handlers.
std::stack< IXMLElementHandler * > m_elementHandlers;
/* ... */
public:
XMLInterpreter( IXMLDocumentHandler *documentHandler );
void parse( const char *const systemID );
private:
// DocumentHandler implementation.
void startElement (const XMLCh *const name, AttributeList &attrs);
void endElement (const XMLCh *const name);
void characters (const XMLCh *const chars, const unsigned int length);
/* ... */
};
XMLInterpreter::XMLInterpreter( IXMLDocumentHandler *documentHandler ) :
m_documentHandler( documentHandler ) /* ... */
{
}
void XMLInterpreter::parse( const char *const systemID )
{
// Create a SAX parser, and parse the document.
SAXParser parser;
parser.setDocumentHandler( this );
parser.parse( systemID );
}
void XMLInterpreter::startElement (const XMLCh *const name, AttributeList &attrs)
{
// If we are parsing an element, use its handler.
// Otherwise, use the documents handler itself.
IXMLElementContainerHandler *top;
if ( !m_elementHandlers.empty() )
top = m_elementHandlers.top();
else
top = m_documentHandler;
// Obtain the element handler of the new element from the current scope.
IXMLElementHandler *newElement = top->child( name );
m_elementHandlers.push( newElement );
// Notify the element handler of the start of the element.
newElement->start( attrs );
}
void XMLInterpreter::endElement (const XMLCh *const name)
{
// Notify the top element handler of the end of the element, then
// pop it, revealing the handler of it's container.
m_elementHandlers.top()->end();
m_elementHandlers.pop();
}
void XMLInterpreter::characters (const XMLCh *const chars,
const unsigned int length)
{
// Notify the top element handler of the characters.
m_elementHandlers.top()->characters( chars, length );
}
Listing 2
// 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 );
}
3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -