@Override
 public boolean startElementHandler(String tagName, ZLStringMap attributes) {
   switch (FB2Tag.getTagByName(tagName)) {
     case FB2Tag.BODY:
       return true;
     case FB2Tag.TITLE_INFO:
       myReadState = READ_SOMETHING;
       break;
     case FB2Tag.BOOK_TITLE:
       if (myReadState == READ_SOMETHING) {
         myReadState = READ_TITLE;
       }
       break;
     case FB2Tag.GENRE:
       if (myReadState == READ_SOMETHING) {
         myReadState = READ_GENRE;
       }
       break;
     case FB2Tag.AUTHOR:
       if (myReadState == READ_SOMETHING) {
         myReadState = READ_AUTHOR;
       }
       break;
     case FB2Tag.LANG:
       if (myReadState == READ_SOMETHING) {
         myReadState = READ_LANGUAGE;
       }
       break;
     case FB2Tag.FIRST_NAME:
       if (myReadState == READ_AUTHOR) {
         myReadState = READ_AUTHOR_NAME_0;
       }
       break;
     case FB2Tag.MIDDLE_NAME:
       if (myReadState == READ_AUTHOR) {
         myReadState = READ_AUTHOR_NAME_1;
       }
       break;
     case FB2Tag.LAST_NAME:
       if (myReadState == READ_AUTHOR) {
         myReadState = READ_AUTHOR_NAME_2;
       }
       break;
     case FB2Tag.SEQUENCE:
       if (myReadState == READ_SOMETHING) {
         String name = attributes.getValue("name");
         if (name != null) {
           name.trim();
           if (name.length() != 0) {
             myBook.setSeriesInfo(name, attributes.getValue("number"));
           }
         }
       }
       break;
   }
   return false;
 }
 @Override
 public boolean endElementHandler(String tag) {
   switch (FB2Tag.getTagByName(tag)) {
     case FB2Tag.TITLE_INFO:
       myReadState = READ_NOTHING;
       break;
     case FB2Tag.BOOK_TITLE:
       if (myReadState == READ_TITLE) {
         myBook.setTitle(myBuffer.toString().trim());
         myReadState = READ_SOMETHING;
       }
       break;
     case FB2Tag.GENRE:
       if (myReadState == READ_GENRE) {
         final String genre = myBuffer.toString().trim();
         if (genre.length() > 0) {
           final ArrayList<Tag> tags = FB2TagManager.humanReadableTags(genre);
           if (tags != null) {
             for (Tag t : tags) {
               myBook.addTag(t);
             }
           } else {
             myBook.addTag(genre);
           }
         }
         myReadState = READ_SOMETHING;
       }
       break;
     case FB2Tag.AUTHOR:
       if (myReadState == READ_AUTHOR) {
         myAuthorNames[0] = myAuthorNames[0].trim();
         myAuthorNames[1] = myAuthorNames[1].trim();
         myAuthorNames[2] = myAuthorNames[2].trim();
         String fullName = myAuthorNames[0];
         if (fullName.length() != 0 && myAuthorNames[1].length() != 0) {
           fullName += ' ';
         }
         fullName += myAuthorNames[1];
         if (fullName.length() != 0 && myAuthorNames[2].length() != 0) {
           fullName += ' ';
         }
         fullName += myAuthorNames[2];
         myBook.addAuthor(fullName, myAuthorNames[2]);
         myAuthorNames[0] = "";
         myAuthorNames[1] = "";
         myAuthorNames[2] = "";
         myReadState = READ_SOMETHING;
       }
       break;
     case FB2Tag.LANG:
       if (myReadState == READ_LANGUAGE) {
         myBook.setLanguage(myBuffer.toString().trim());
         myReadState = READ_SOMETHING;
       }
       break;
     case FB2Tag.FIRST_NAME:
       if (myReadState == READ_AUTHOR_NAME_0) {
         myReadState = READ_AUTHOR;
       }
       break;
     case FB2Tag.MIDDLE_NAME:
       if (myReadState == READ_AUTHOR_NAME_1) {
         myReadState = READ_AUTHOR;
       }
       break;
     case FB2Tag.LAST_NAME:
       if (myReadState == READ_AUTHOR_NAME_2) {
         myReadState = READ_AUTHOR;
       }
       break;
     default:
       break;
   }
   myBuffer.delete(0, myBuffer.length());
   return false;
 }