Konvertieren von QDomElement in die QString-/Container-Klasse
Frage
Nehmen wir an, wir haben das folgende XML-Dokument:
<root>
<options>
...
</options>
<children>
<child name="first">12345</child>
<child name="second">
<additionalInfo>abcd</additionalInfo>
</children>
</root>
Ich möchte eine String-Darstellung der „untergeordneten“ Knoten erhalten und sie an ein Array anhängen (ich möchte die XML-Syntax nicht verlieren, daher ist .text() keine Option).Das erste Kind würde zum Beispiel so aussehen:
QString child = "<child name="first">12345</child>";
Ich habe den folgenden Code verwendet, um die Elemente abzurufen:
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");
}
}
Das Problem ist, dass doc.isNull immer false zurückgibt (anscheinend kann ich das Element nicht in ein Dokument konvertieren).Gibt es eine Möglichkeit, wie ich das durchführen kann?
Bearbeiten:
Ich möchte hinzufügen, dass QString hier nicht obligatorisch ist.Grundsätzlich ist jede Klasse, die später zum Abrufen der Daten verwendet werden kann, in Ordnung (ich werde diese Knoten speichern und sie später zum Initialisieren anderer Objekte verwenden).Wichtig ist, dass ich auf diese Werte auch dann zugreifen kann, wenn das Originaldokument zerstört wurde. Beispielsweise ist es möglich, diese Elemente direkt in einem Array zu speichern (z. B.QList), mit der später darauf zugegriffen werden kann.
Lösung
Ich werde auf meine eigene Frage eine Antwort hinzufügen.Keine Ahnung warum, aber sieht aus, als hätte ich die folgende Funktion in der Dokumentation verpasst.
void qdomnode :: speichern (qtextstream & str, int scent) const
Es ist so ziemlich alles, was ich brauche, um einen Knoten in eine Zeichenfolge umzuwandeln, z. B.:
generasacodicetagpre.Andere Tipps
Da Sie das XML-Format selbst benötigen, benötigen Sie es nicht QDomElement
oder QDomDocument
. QDomElement
Und QDomDocument
werden verwendet um die gespeicherten Daten zu erhalten in den XML-Dokumenten.
Sie benötigen lediglich einen gewöhnlichen Dateidurchlauf.
Öffnen Sie die Datei mit
bool QFile::open ( OpenMode mode ) [virtual]
Sie können den gesamten Inhalt der Datei lesen, indem Sie:
QByteArray QIODevice::readAll ()
dem Sie es zuordnen können QString
.
Für z.B.,
QString entireContents = xmlFile->readAll();
Dann können Sie den gesamten Inhalt basierend auf aufteilen Neue Zeile \n
Charakter verwenden
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
Jetzt entspricht jeder Index jeder Zeile in der XML-Datei.Sie können es durchqueren und die gewünschten Linien erhalten.
Ich hoffe es hilft...
Nun, ich denke, Sie können nicht extrem tun, was Sie mit den QT-XML-Klassen nicht möchten, aber es sollte einfach die Saite selbst rekonstruieren (vielleicht nicht mit dem Original in 100%, sondern mit derselben Bedeutung), basierend auf demMethoden Die Qt XML-Klassen stellen bereit.
edit: Kleiner Code-Snippet, der das Ding tun könnte (ungeprüft):
generasacodicetagpre.