Example #1
0
File: main.cpp Project: ifhw/study
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();
}
Example #2
0
/* 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;
}
Example #3
0
/**
 * @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;
}
Example #4
0
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();
}