0

I am using XMLData access for creating a xml file.

Following is the code for creating the new xml file

if(myFile.open(QIODevice::WriteOnly)) {
    QVariantList messageList;
    XmlDataAccess xda;
    QDataStream out(&myFile);
// Iterate through all the messages and convert it into data stream
foreach (const Message &message, inboxMessages) {

    QVariantMap messageMap;

    //Adding sender Details to QVariantMap.
    messageMap["senderName"] = QVariant(message.sender().name());
    messageMap["addressSender"] = QVariant(message.sender().address());

    // There can be multiple recipients of mail so writing the recipient List
    QList<MessageContact> recipientList  = message.recipients();
    QVariantList recipientVariantList = QVariantList() ;
    foreach (const MessageContact &messageContact , recipientList) {
        QVariantMap recipientMap;
        recipientMap["recipientName"] = QVariant(messageContact.name());
        recipientMap["recipientAddress"] = QVariant(messageContact.address());
        recipientVariantList << QVariant(recipientMap);
    }
    messageMap["recipients"] = QVariant(recipientVariantList);
    // Other details of message like body,text etc.
    messageMap["date"] = QVariant(message.serverTimestamp().toString(Qt::TextDate));
    messageMap["subject"] = QVariant(message.subject());
    messageMap["body"] = QVariant(message.body(MessageBody::PlainText).plainText());

    // Adding this object to Qvariant List
    messageList = QVariantList() << QVariant(messageMap);

}
QVariantMap topLevelMessageMap;
topLevelMessageMap[".root"] = QVariant("messages");
topLevelMessageMap["message"] = QVariant(messageList);

QVariant messageData = QVariant(topLevelMessageMap);
xda.save(messageData, &myFile);
successFlag = true;

I am also writing its corresponding read code where also i am using XMLDataAccess

XmlDataAccess xda ;
QVariant parsedresponselist ;
    QFile myFile("/accounts/1000/removable/sdcard/messages/messages.xml");

    if(myFile.open(QIODevice::ReadOnly)) {
        parsedresponselist = xda.load(&myFile,"/messages/message");

    }

Now problem here is how to retrieve further elements from parsedresponselist

Please suggest

Thanks & Regards

Timothy Drisdelle
  • 395
  • 3
  • 5
  • 14

1 Answers1

0

The return value from XmlDataAccess::load will be a QVariant containing either a QVariantList, QVariantMap or QString. The conversion supported is relatively simple (as detailed here) with the aim being preserving the data structure, not a specific XML structure. It may be helpful to dump the contents of parsedresponselist to qDebug() and start picking it apart from there.

What I do now generally is use QVariant::canConvertTo<QVariantMap>() and QVariant::canConvertTo<QVariantList>() to determine which kind of variant is returned and then traverse the tree either iterating over the items in the list, or over the keys in the map, or use other accessors until I find the data I'm looking for.

Richard
  • 8,920
  • 2
  • 18
  • 24