⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mperry.txt

📁 国外的-C++ 200多个源码
💻 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 + -