Skip to content

Instantly share code, notes, and snippets.

@pcolby
Last active December 28, 2022 19:44

Revisions

  1. pcolby revised this gist Sep 8, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion xmlToVariant.cpp
    Original file line number Diff line number Diff line change
    @@ -54,7 +54,7 @@ QVariantMap xmlStreamToVariant(QXmlStreamReader &xml, const QString &prefix = QL
    xml.processingInstructionData().toString());
    break;
    case QXmlStreamReader::StartElement:
    map.insertMulti(xml.name().toString(), toVariant(xml, prefix, maxDepth-1));
    map.insertMulti(xml.name().toString(), xmlStreamToVariant(xml, prefix, maxDepth-1));
    break;
    default:
    qWarning() << QObject::tr("unexpected XML tokenType %1 (%2)")
  2. pcolby renamed this gist Sep 14, 2013. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. pcolby created this gist Sep 14, 2013.
    65 changes: 65 additions & 0 deletions xmlStreamToVariant.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,65 @@
    QVariantMap xmlStreamToVariant(QXmlStreamReader &xml, const QString &prefix = QLatin1String("."), const int maxDepth = 1024)
    {
    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:
    map.insertMulti(xml.name().toString(), toVariant(xml, prefix, maxDepth-1));
    break;
    default:
    qWarning() << QObject::tr("unexpected XML tokenType %1 (%2)")
    .arg(xml.tokenString()).arg(xml.tokenType());
    }
    }
    return map;
    }