def read(self):
     handlers = {
         'document': (self.onStartDocument, None, self.onEndDocument),
         'page': (self.onStartPage, self.onPageText, self.onEndPage)
     }
     self.reader = XmlDocumentReader(handlers)
     self.reader.read(self.fileName)
     return self.document
class DocumentReader(object):
    
    def __init__(self, fileName):
        self.fileName = fileName
        self.document = None
        self.currentPage = None
        self.pages = []
        
    def read(self):
        handlers = {
            'document': (self.onStartDocument, None, self.onEndDocument),
            'page': (self.onStartPage, self.onPageText, self.onEndPage)
        }
        self.reader = XmlDocumentReader(handlers)
        self.reader.read(self.fileName)
        return self.document
    
    
    def onStartPage(self, lineNumber, attributes):
        title = attributes.get('title')
        if title is None:
            raise XmlException('Invalid data at line %d' %
                               lineNumber)
        self.currentPage = Page(title)
        
        
    def onEndPage(self, lineNumber):
        self.pages.append(self.currentPage)
    
    
    def onPageText(self, lineNumber, value):
        self.currentPage.text = value.replace('\n', '\r\n')
        
        
    def onStartDocument(self, lineNumber, attributes):
        self.document = Document(self.fileName)
        
        
    def onEndDocument(self, lineNumber):
        self.document.pages = self.pages