Question

Disons que nous avons le document XML suivant :

<root>
    <options>
        ...
    </options>
    <children>
        <child name="first">12345</child>
        <child name="second">
            <additionalInfo>abcd</additionalInfo>
    </children>
</root>

Je voudrais obtenir une représentation sous forme de chaîne des nœuds "enfants" et les ajouter dans un tableau (je ne veux pas perdre la syntaxe XML donc .text() n'est pas une option).Par exemple, le premier enfant ressemblerait à :

QString child = "<child name="first">12345</child>";

J'ai utilisé le code suivant pour récupérer les éléments :

QDomDocument doc;
QDomElement element;
element = xml->documentElement();
if(element.isNull() == false)
{
    element = element.firstChildElement("children");
    if(element.isNull()) return;

    element = element.firstChildElement("child");
    while(element.isNull() == false)
    {
        doc = element.toDocument();
        if(doc.isNull() == false)
        {
            // save string into array
            array.append(doc.toString());
        }
        element = element.nextSiblingElement("child");
    }
}

Le problème est que doc.isNull renvoie toujours false (on dirait que je ne parviens pas à convertir l'élément en document).Existe-t-il un moyen de réaliser cela ?

Modifier:

Je voudrais ajouter que QString n'est pas obligatoire ici.Fondamentalement, toute classe qui peut être utilisée ultérieurement pour récupérer les données est acceptable (je sauvegarderai ces nœuds et les utiliserai pour initialiser d'autres objets plus tard).L'important est que je puisse accéder à ces valeurs même lorsque le document original a été détruit. Par exemple, il est possible de stocker ces éléments directement dans un tableau (par ex.QList), qui pourra être utilisé pour y accéder ultérieurement.

Autres conseils

Puisque vous avez besoin du format XML lui-même, vous n'en avez pas besoin QDomElement ou QDomDocument. QDomElement et QDomDocument sont utilisés pour obtenir les données stockées dans les documents XML.

Vous avez juste besoin d’une traversée de fichiers ordinaire.

Ouvrez le fichier en utilisant

bool QFile::open ( OpenMode mode )   [virtual]

Vous pouvez lire l'intégralité du contenu du fichier en,

QByteArray QIODevice::readAll ()

auquel vous pouvez l'attribuer à un QString.

Par exemple,

QString entireContents = xmlFile->readAll();

Ensuite, vous pouvez diviser l'intégralité du contenu en fonction du nouvelle ligne \n personnage utilisant

QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

Désormais, chaque index correspond à chaque ligne du fichier XML.Vous pouvez le parcourir et obtenir les lignes d’intérêt souhaitées.

J'espère que cela aide...

Eh bien, je pense que vous ne pouvez pas faire d'excédence ce que vous voulez avec les classes QT XML, mais il devrait être possible de simplement reconstruire la chaîne vous-même (peut-être ne correspondant pas à l'original à 100%, mais avec la même signification), basé sur leMéthodes Les classes QT XML fournissent.

edit: Petit extrait de code qui pourrait faire la chose (non testée):

QString domElementToRawXML(const QDomElement& elem)
{
    QString head = "<"+elem.tagName();
    QDomNamedNodeMap attrs = elem.attributes();
    for(int i = 0; i<attrs.size(); ++i)
    {
        QDomAttr attr = attrs.item(i).toAttr();
        head += 
            QString::fromLatin1(" %0=\"%1\"")
            .arg(attr.name())
            .arg(attr.value());
    }
    head += ">";
    return head + elem.text() + "</"+elem.tagName()+">";
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top