Conversion de QDomElement en classe QString/Conteneur
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.
La solution
Je vais ajouter une réponse à ma propre question.Aucune idée pourquoi, mais on dirait que j'ai manqué la fonction suivante dans la documentation.
Vide QDomnode :: Enregistrer (qtextstream & Str, intenter) const
Il fait à peu près tout ce que j'ai besoin de convertir un nœud en une chaîne, par exemple:
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
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.
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()+">";
}