Bestimmte Bereiche aus XML-Datei entfernen
-
Hallo!
Folgendes Problem:
Ich habe eine Reihe von XML-Dateien, aus denen ich gerne einige Tags entfernen würde (immer die gleichen Tags die raus sollen).
Hatte mir gedacht, ich mach das mit getline, klappt auch prinzipiell, allerdings nur, wenn ich nur ein Element entfernen will, bei mehreren gibts leider Probleme...
Kann jm. mal über den Code schauen und mir sagen, wo mein Denkfehler ist? Bin leider noch ziemlicher Neuling in Sachen C++#include "stdafx.h" #include <iostream> #include <fstream> #include <conio.h> #include <string> using namespace std; int main(int argc, char* argv[]) { ifstream datei; ofstream neuedatei; string zeile; datei.open("test.xml", ios::in); neuedatei.open("temp.xml", ios::out); bool gefunden = false; do { getline(datei,zeile); if(zeile.find( "<Datum>" ) !=string::npos) gefunden = true; if(!gefunden) neuedatei << zeile << endl; if(zeile.find( "</Datum>" ) !=string::npos) gefunden = false; getline(datei,zeile); if(zeile.find( "<Plakat>" ) !=string::npos) gefunden = true; if(!gefunden) neuedatei << zeile << endl; if(zeile.find( "</Plakat>" ) !=string::npos) gefunden = false; }while(!datei.eof()); datei.close(); neuedatei.close(); return 0; }
-
ich empfehle einen fertigen parser zu benutzen, beispielsweise tinyxml.
-
oder expat http://expat.sourceforge.net/
-
Ich wollte eigentlich keinen externen Parser nutzen...
Müsste ja auch so gehen, hab nur nen kleinen Fehler im Programmcode anscheinend. Keiner eine Idee dazu?
-
Naja mach es so:
#include "stdafx.h" #include <iostream> #include <fstream> #include <string> int main(int argc, char* argv[]) { std::ifstream file_stream_old("input.xml"); if (!file_stream_old) { std::cerr << "FEHLER: \"input.xml\" konnte nicht geöffnet werden!" << std::endl; return 1; } std::ofstream file_stream_new("output.xml"); if (!file_stream_new) { std::cerr << "FEHLER: \"output.xml\" konnte nicht erstellt werden!" << std::endl; return 2; } std::string string_line; while (std::getline(file_stream_old, string_line)) { } }. So das dazu erstmal. Dann das lesen selbst. Hier musst du dir merken, ob du nun gerade in einem <Datum>-Tag bist, oder nicht. Dabei solltest du beachten, dass ein <Datum /> auch ein abgeschlossenes <Datum>-Tag ist!
Dann nimm je eine bool-Variable für den Status eines Tags. Nicht eine für zwei!Versuch es nochmal. Wenn du es dann jetzt immernoch nicht schafst, sag bescheid. Aja, wenn er im Tag ist, brauchst du nicht nach dem Anfang für dieses Tag zu suchen! (Performance steigernd!)
-
mo111 schrieb:
Ich wollte eigentlich keinen externen Parser nutzen...
wenn du meinst. es ist aber nicht so einfach, xml richtig zu parsen.
(D)Evil schrieb:
Dabei solltest du beachten, dass ein <Datum /> auch ein abgeschlossenes <Datum>-Tag ist!
...während z. b.
<!-- <Datum /> -->keines ist.
-
(D)Evil schrieb:
Naja mach es so:
#include "stdafx.h" #include <iostream> #include <fstream> #include <string> int main(int argc, char* argv[]) { std::ifstream file_stream_old("input.xml"); if (!file_stream_old) { std::cerr << "FEHLER: \"input.xml\" konnte nicht geöffnet werden!" << std::endl; return 1; } std::ofstream file_stream_new("output.xml"); if (!file_stream_new) { std::cerr << "FEHLER: \"output.xml\" konnte nicht erstellt werden!" << std::endl; return 2; } std::string string_line; while (std::getline(file_stream_old, string_line)) { } }. So das dazu erstmal. Dann das lesen selbst. Hier musst du dir merken, ob du nun gerade in einem <Datum>-Tag bist, oder nicht. Dabei solltest du beachten, dass ein <Datum /> auch ein abgeschlossenes <Datum>-Tag ist!
Dann nimm je eine bool-Variable für den Status eines Tags. Nicht eine für zwei!Versuch es nochmal. Wenn du es dann jetzt immernoch nicht schafst, sag bescheid. Aja, wenn er im Tag ist, brauchst du nicht nach dem Anfang für dieses Tag zu suchen! (Performance steigernd!)
So ganz versteh ich das noch nicht

Kannst du mir vllt. bei dem in der whileschleife etwas behilflich sein?
Desweiteren sind mir noch zwei andere Fragen gekommen:- Wenn ich ein einem Tag noch "Untertags" hab, kann ich die automatisch mit entfernen?
- Ginge es vllt. einfacher, statt zu löschen die Tags die man braucht inkl. Inhalt in eine andere Datei zu packen?
Danke schonmal
-
Ich nochmal...
Hab' mir jetzt doch mal TinyXML runtergeladen, in der Hoffnung damit ans Ziel zu kommen... Aber ich muss ehrlich sagen, da blicke ich überhaupt nicht durch
Ich habe das Gefühl, dass nur mein Quelltext unübersichtlicher wird und komme ansonsten gar nicht vorran...
Kann vllt. jemand mal kurz nen Beispielcode posten, wie man mit TinyXML Quelltext aus einer Datei einliest, dort Tags/Zeilen löscht und anschließend das ganze in eine neue Datei speichert? Wär echt superlieb ich bin hier schon am verzweifeln gerade.
Danke
-
ich hätte dir gerne ein stück code gepostet, leider lässt der so toll funktionierende spamfilter des forums mich nicht. tut mir leid.
-
http://rafb.net/p/pCQxBJ95.html
musste es da reinstellen, irgendwas an dem code mag der spamfilter hier nicht.
code ist so aus dem kopf geschrieben, keine garantie dass das so auch funktioniert. sollte aber zumindest so ähnlich gehen.
-
der mob schrieb:
...irgendwas an dem code mag der spamfilter hier nicht...
Registriere dich, dann klappt das auch. Der Spamfilter hat einen großen Sinn, da vor allem unregistrierte hier gerne spammen.
cu André
-
asc schrieb:
Registriere dich, dann klappt das auch. Der Spamfilter hat einen großen Sinn, da vor allem unregistrierte hier gerne spammen.
mag ja sein, aber er ist trotzdem schon seit monaten kaputt.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-197413.html
http://www.c-plusplus.net/forum/viewtopic-var-t-is-194810.html--
lustigerweise tritt der fehler gerade jetzt bei diesem posting auf. ich versuche ihn mal zu umgehen indem ich einfach sinnlosen text hier hinschreibe.
tja, das hat noch nicht gereicht, also schreibe ich noch mehr text hier hin.
so langsam glaube ich, dass die unregs so weggemobbt werden sollen. könnt ihr nicht einfach das posten für unregs verbieten? das artet nämlich so langsam echt in pure verarsche aus.
so, ich hoffe das reicht jetzt für den beknackten filter.