void FileReader::parseFile(QString &filename, FileRecord &record) { QFileInfo f(filename); QFile file(filename); QByteArray data; QXmlStreamReader reader; if (f.suffix() == "fb2") { if (!file.open(QFile::ReadOnly | QFile::Text)) { return; } reader.setDevice(&file); } else if (f.suffix() == "zip") { int res = unzipFile(filename, data); if (0 != res) { return; } reader.addData(data); } reader.readNext(); if (reader.isStartDocument()) { record.setEncoding(reader.documentEncoding().toString()); } if (reader.readNextStartElement()) { if (reader.name() == "FictionBook") { if (reader.readNextStartElement()) { if (reader.name() == "description") { if (reader.readNextStartElement()) { if (reader.name() == "title-info") { while (reader.readNextStartElement()) { if (reader.name() == "genre") { QString genre = reader.readElementText(); if (reader.attributes().hasAttribute("match")) { int match = reader.attributes().value("match").toInt(); record.addGenre(genre, match); } else record.addGenre(genre); } else if (reader.name() == "author") { Person *tmpAuthor = new Person(); while (reader.readNextStartElement()) { if (reader.name() == "first-name") { tmpAuthor->setFirstName(reader.readElementText()); } if (reader.name() == "middle-name") { tmpAuthor->setMiddleName(reader.readElementText()); } if (reader.name() == "last-name") { tmpAuthor->setLastName(reader.readElementText()); } if (reader.name() == "nickname") { tmpAuthor->setNickname(reader.readElementText()); } if (reader.name() == "home-page") { tmpAuthor->addHomePage(reader.readElementText()); } if (reader.name() == "email") { tmpAuthor->addEmail(reader.readElementText()); } if (reader.name() == "id") { tmpAuthor->setId(reader.readElementText()); } } record.addAuthor(*tmpAuthor); delete tmpAuthor; } else if (reader.name() == "book-title") { record.setBookTitle(reader.readElementText()); } else if (reader.name() == "sequence") { if (reader.attributes().hasAttribute("name")) { QString sequence = reader.attributes().value("name").toString(); if (reader.attributes().hasAttribute("number")) { int number = reader.attributes().value("number").toInt(); record.addSequence(sequence, number); } else record.addSequence(sequence); } } else reader.skipCurrentElement(); } } } } } } } file.close(); }