QDomDocument - XML-Strings als neue Nodes einfügen?

Alles rund um die Programmierung mit Qt
Antworten
Ethan
Beiträge: 10
Registriert: 14. Mai 2007 09:02

QDomDocument - XML-Strings als neue Nodes einfügen?

Beitrag von Ethan »

Wie der Titel schon sagt habe ich die Absicht zur Laufzeit bestimmte XML-Strings (Beispiel: <node1 attr1="0x23" att3="xyz"></node1>) and einer bestimmten Position im QDomDocument einzufügen.

Das Problem dabei ist jetzt, dass ich keinen Weg finde wie ich QDomNode QDomDocument oder QDomElement dazu bringe einen kompletten ungeparsten XML-String zu schlucken um daraus ein neuen Node zu erstellen.

Hat schon mal jemand Erfahrungen damit gemacht?
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Habe mir extra ein XmlModel geschrieben und das dann immer darüber gelöst. War sehr komfortabel.
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

ah eventuell meinst du auch sowas:

Code: Alles auswählen

QString xmlStream = document.toString(); // load "old" document (without added line)
			

if (xmlStream.indexOf("<geos/>") != -1) {// no geo in list -> replace <geos/> tag with <geos> data </geos> tag
	xmlStream.replace("<geos/>", "<geos> </geos>");
} // if

xmlStream.insert(xmlStream.indexOf("</geos>") -1, newPart.toString()); // insert new line		
document = QDomDocument(); // create empty dom doc
document.setContent(xmlStream); // domdoc with new line
newPart.toString() wäre dann eben dein String, den du oben als Beispiel angegeben hast
Ethan
Beiträge: 10
Registriert: 14. Mai 2007 09:02

Beitrag von Ethan »

Das Problem ist, dass ich einen Pfad und einen String bekomme und
diesen XML-String in diesem Pfad einfüge.

Beispiel:

<root>
<a>
<b></b>
</a>
<a2>
<b></b>
</a2>
</root>

Wenn ich jetzt sage, der Pfad zum Einfügen des XML-Strings ist
root/a2/b würde er trotzdem unter dem ersten b unter dem Pfad root/a/b
einfügen.
Der Pfad wiederum ist eine eigene Klasse, die auch die Attribute aller Elemente auf Korrektheit überprüft.

Also wenn es da keine Lösung von Qt gibt wird das jetzt sehr unschön ;-)
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Warum machst du es nicht wie im letzten Posting von mir? Prüfen kannst du dann doch immernoch? Du musst schonmal genau beschreiben, was du hast und was du möchtest.

Entweder du baust dir die DOM Struktur und durchläufst die elementweise durch oder du nimmst eben den Stringansatz. Ich verstehe nicht, was du willst?
Ethan
Beiträge: 10
Registriert: 14. Mai 2007 09:02

Beitrag von Ethan »

Vielleicht war das Beispiel etwas unverständlich, sorry :)

Also ich meinte, wenn ich indexOf hernehme, bekomme ich ja das erste
was er findet.
Okay natürlich könnte ich auch ab der Stelle weitersuchen bis ich alle GLEICHEN Elemente durchhabe und habe dann eine Liste von Elementen.

Doch ich möchte eben über einen Pfad in der XML einfügen, nicht bei
dem ersten, zweiten oder 10. Auftachen des Elements im string.

Mit DOM geht das, jedoch kann ich keinen XML-String einfügen (oder ich hab keine Möglichkeit gefunden, weil ich Tomaten auf den Augen habe)

Deine Lösung ist ein guter Ansatz, aber sie löst nicht das Pfad Problem, dass ich oben versucht habe zu schildern.

Ich hoffe damit sind alle Klarheiten beseitigt :)

EDIT:
Man könnte natürlich, wenn man sagt ich will Element "<x></x>" im Pfad root/el1/uel10 einfügen, nach dem Element <uel10> suchen und Abfragen ob VOR dem Erscheinen <root> und <el1> erschienen sind ... aber das grenzt schon fast wieder an einem eigenen XML-Parser und ist sicher keine gute Lösung.
Man muss ja beachten, dass man nicht ein gleichnamiges (und gleich-Attributiges ;) ) Element in root/xyz/schlagmichtot erwischt, weil man sein Element <x></x> dann an der falschen Stelle hat.
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Hört sich schon besser an..

1. per DomDocument.setContent() wie bei mir oben deinen neuen String in ein DomDoc packen/ konvertieren
2. diesen dann zum DocumentFragment konvertieren
3. QDomNode::insertAfter(nimmt auch DocumentFragments) an der gewünschten Stelle einfügen..die musst du dann aber schon per DOM erreichen - also das Element, nachdem eingefügt werden soll..

Habe es nicht getestet aber in etwa so sollte es imho funktionieren.
Ethan
Beiträge: 10
Registriert: 14. Mai 2007 09:02

Beitrag von Ethan »

Das klingt schon besser ;)

Ich werds dann mal ausprobieren, wenn ich die Zeit finde,
vielen Dank für deine Hilfe!
Antworten