int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QFile file("../myXmlStream/my.xml"); if (!file.open(QFile::ReadOnly | QFile::Text)) { qDebug()<<"Error: cannot open file"; return 1; } QXmlStreamReader reader; // 设置文件,这时会将流设置为初始状态 reader.setDevice(&file); // 如果没有读到文档结尾,而且没有出现错误 while (!reader.atEnd()) { // 读取下一个记号,它返回记号的类型 QXmlStreamReader::TokenType type = reader.readNext(); // 下面便根据记号的类型来进行不同的输出 if (type == QXmlStreamReader::StartDocument) qDebug() << reader.documentEncoding() << reader.documentVersion(); if (type == QXmlStreamReader::StartElement) { qDebug() << "<" << reader.name() << ">"; if (reader.attributes().hasAttribute("id")) qDebug() << reader.attributes().value("id"); } if (type == QXmlStreamReader::EndElement) qDebug() << "</" << reader.name() << ">"; if (type == QXmlStreamReader::Characters && !reader.isWhitespace()) qDebug() << reader.text(); } // 如果读取过程中出现错误,那么输出错误信息 if (reader.hasError()) { qDebug() << "error: " << reader.errorString(); } file.close(); return a.exec(); }
/* private self */ QMap<QString, QString> XMLerLoadFileThread::getInformationFromFile ( ) { QMap<QString, QString> result; QFile xml_file( fileName() ); if ( !xml_file.exists() ) { emit error ( tr("File %1 does not exist.").arg( fileName() ) ); return result; } if ( !xml_file.open ( QIODevice::ReadOnly | QIODevice::Text ) ) { emit error ( tr("Can not open file %1.").arg( fileName() ) ); return result; } QString encoding; QString version; QXmlStreamReader reader ( &xml_file ); while ( !reader.atEnd() ) { QXmlStreamReader::TokenType tt = reader.readNext(); if ( tt == QXmlStreamReader::StartDocument ) { encoding = reader.documentEncoding().toString(); version = reader.documentVersion().toString(); break; } } if ( !encoding.isEmpty() ) result.insert("encoding", encoding); if ( !version.isEmpty() ) result.insert("version", version); xml_file.close(); return result; }
/** * @brief Convert an XML stream to a hierarchical QVariantMap. * * This function is used internally to embed opaque XML structures, such as the * SQS service's ErrorResponse::Error::Detail, which the SQS schema defines as * an arbitrary complex type. * * @note This static function exists within the AwsAbstractResponse for * historic reasons. It should probably be moved our of this class, and * into a more generic utility space at some point. * * @param xml XML stream to convert. * @param prefix Prefix to apply to special (non-element) child entry names. * @param maxDepth Maximum depth to traverse before truncating the tree. * * @return A QVariantMap representing the \a xml XML fragment. * * @todo Move this toVariant function to somewhere more generic. */ QVariantMap AwsAbstractResponse::toVariant( QXmlStreamReader &xml, const QString &prefix, const int maxDepth) { if (maxDepth < 0) { qWarning() << QObject::tr("max depth exceeded"); return QVariantMap(); } if (xml.hasError()) { qWarning() << xml.errorString(); return QVariantMap(); } if (xml.tokenType() == QXmlStreamReader::NoToken) xml.readNext(); if ((xml.tokenType() != QXmlStreamReader::StartDocument) && (xml.tokenType() != QXmlStreamReader::StartElement)) { qWarning() << QObject::tr("unexpected XML tokenType %1 (%2)") .arg(xml.tokenString()).arg(xml.tokenType()); return QVariantMap(); } QVariantMap map; if (xml.tokenType() == QXmlStreamReader::StartDocument) { map.insert(prefix + QLatin1String("DocumentEncoding"), xml.documentEncoding().toString()); map.insert(prefix + QLatin1String("DocumentVersion"), xml.documentVersion().toString()); map.insert(prefix + QLatin1String("StandaloneDocument"), xml.isStandaloneDocument()); } else { if (!xml.namespaceUri().isEmpty()) map.insert(prefix + QLatin1String("NamespaceUri"), xml.namespaceUri().toString()); foreach (const QXmlStreamAttribute &attribute, xml.attributes()) { QVariantMap attributeMap; attributeMap.insert(QLatin1String("Value"), attribute.value().toString()); if (!attribute.namespaceUri().isEmpty()) attributeMap.insert(QLatin1String("NamespaceUri"), attribute.namespaceUri().toString()); if (!attribute.prefix().isEmpty()) attributeMap.insert(QLatin1String("Prefix"), attribute.prefix().toString()); attributeMap.insert(QLatin1String("QualifiedName"), attribute.qualifiedName().toString()); map.insertMulti(prefix + attribute.name().toString(), attributeMap); } } for (xml.readNext(); (!xml.atEnd()) && (xml.tokenType() != QXmlStreamReader::EndElement) && (xml.tokenType() != QXmlStreamReader::EndDocument); xml.readNext()) { switch (xml.tokenType()) { case QXmlStreamReader::Characters: case QXmlStreamReader::Comment: case QXmlStreamReader::DTD: case QXmlStreamReader::EntityReference: map.insertMulti(prefix + xml.tokenString(), xml.text().toString()); break; case QXmlStreamReader::ProcessingInstruction: map.insertMulti(prefix + xml.processingInstructionTarget().toString(), xml.processingInstructionData().toString()); break; case QXmlStreamReader::StartElement: { const QString elementName = xml.name().toString(); map.insertMulti(elementName, toVariant(xml, prefix, maxDepth-1)); break; } default: qWarning() << QObject::tr("unexpected XML tokenType %1 (%2)") .arg(xml.tokenString()).arg(xml.tokenType()); } } return map; }
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(); }