Samara Geschrieben 22. April 2010 Geschrieben 22. April 2010 Servus Leute, ich brauche unbedingt ganz dringend Hilfe. Ich programmiere seit kurzem mit Turbo C++, und möchte nun aus einer XML-Datei jeweils einen bestimmen Block auslesen/einlesen. Dieser Block ist ein Bibelvers, zu einem bestimmten Datum, dass der Nutzer eingeben soll, dh. in der XML-Datei sind 365 Blöcke mit je 7 bzw 8 Zeilen. Ich weiß absolut nicht weiter, und würde mich sehr über Antworten freuen. Mein bisheriger Code sieht folgendermaßen aus: void Losung_XML::DateiAuslesen() //Datei öffnen funkt { char Text[1000]; Datei.open("C:\\Users\\boer\\Desktop\\Losung_2010_XML\\Losungen.xml"); if (!Datei.is_open()) { cout << "Fehler beim Oeffnen der Datei!" << endl; } else if(Datei.is_open()) { cout << "Geben Sie ein Datum ein: tt.mm.jjjj" <<endl; /* fgets(Datum.Tag, stdin); fgets(Datum.Monat, stdin); fgets(Datum.Jahr, stdin); */ //cout << Datei << endl; getchar(); } //----------------------------------------------------------------------- void Losung_XML::DateiDurchsuchen() { string Text; getline(filename, Text, ""); seekg(1); int die_zahl(0); "C:\\Users\\boer\\Desktop\\Losung_2010_XML\\Losungen.xml" >> die_zahl; } //------------------------------------------------------------------------ void Losung_XML::DateiAusgeben() { char buff[255]=""; int gelesen = 0; string str; string vergleich = "test"; getline(Datei, str); cout<<str<<endl;} Vielen Dank schonmal im Voraus. Liebe Grüße Sami Zitieren
frobber Geschrieben 22. April 2010 Geschrieben 22. April 2010 (bearbeitet) Ein kurzes Beispiel, wie die XML Datei aussieht wäre hilfreich. Spielt in einer XML Datei mit 365 Einträgen das Jahr eine Rolle? Ich gehe mal davon aus, dass jedem Tag ein Vers mit 7-8 Zeilen zugeordnet ist? Bearbeitet 22. April 2010 von frobber Zitieren
Samara Geschrieben 22. April 2010 Autor Geschrieben 22. April 2010 ja, genau jeder Tag hat ein paar Zeilen, und das Jahr spielt keine Rolle bzw. das Programm ist nur für das Jahr 2010. Leider kenn ich mich mit XML gar nicht aus, aber ich habe dir einfach mal die ersten paar Zeilen kopiert: <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2009-10-14T16:20:31"> <Losungen> <Datum> 2010-01-01T00:00:00 </Datum> <Wtag> Freitag </Wtag> <Sonntag> Neujahr </Sonntag> <Losungstext> Was können die Weisen Weises lehren, wenn sie des HERRN Wort verwerfen? </Losungstext> <Losungsvers> Jeremia 8,9 </Losungsvers> <Lehrtext> Lasst das Wort Christi reichlich unter euch wohnen: Lehrt und ermahnt einander in aller Weisheit; mit Psalmen, Lobgesängen und geistlichen Liedern singt Gott dankbar in euren Herzen. </Lehrtext> <Lehrtextvers> Kolosser 3,16 </Lehrtextvers> </Losungen> <Losungen> <Datum> 2010-01-02T00:00:00 </Datum> <Wtag> Samstag </Wtag> <Losungstext> Der HERR ist König; des freue sich das Erdreich und seien fröhlich die Inseln, soviel ihrer sind. </Losungstext> <Losungsvers> Psalm 97,1 </Losungsvers> <Lehrtext> /Der Engel sprach zu Maria:/ Dein Sohn wird groß sein und Sohn des Höchsten genannt werden; und Gott der Herr wird ihm den Thron seines Vaters David geben. </Lehrtext> <Lehrtextvers> Lukas 1,32 </Lehrtextvers> </Losungen> Hilft dir das weiter? Vielen Dank schonmal für die Mühe ; ) Lg Zitieren
_n4p_ Geschrieben 22. April 2010 Geschrieben 22. April 2010 hi, sollst/willst du alles selbst machen? wenn nein, es gibt einige fertige bibliotheken zum thema XML. TinyXPath home page Xerces-C++ XML Parser wenn doch hilft dir vielleicht: XML.com: XML Programming with C++ P.S. Samara Morgan? Zitieren
frobber Geschrieben 23. April 2010 Geschrieben 23. April 2010 Gibts Turbo C++ überhaupt noch? Das hab ich schon sehr lange nicht mehr gesehen. Tut jetzt aber auch nichts zur Sache. Dein Problem ist nicht ganz einfach und recht aufwändig in der Implementierung. Es kommt halt drauf an wie weit man das treiben will. Wie _n4p_ schon gesagt hat gibt es auch freie Bibliotheken, die sich mit dem Thema XML beschäftigen. Die Einarbeitung in solche Bibliotheken ist aber nicht zu unterschätzen, aber es lohnt sich durchaus, wenn du etwas Zeit hast. Es kommt jetzt hauptsächlich darauf an, wie fit du in C/C++ bist und wieviel Zeit du hast. Ich würde mal den Fakt, dass es sich um eine XML Datei handelt aussen vor lassen. Hier geht es hauptsächlich darum, dass du ein paar Funktionen zum parsen der verschiedenen Tags findest. Ich hab leider nur wenig Zeit, möchte dir aber einen möglichen Ansatz zeigen. Zuerst musst du mal ein paar sinnvolle Strukturen finden, also zum Beispiel: // datum struct sDate { unsigned char Day; // 1...31 unsigned char Month; // 1...12 unsigned Year; // 0...?? unsigned char Weekday;// 0..6 (0-Montag, ... , 6-Sonntag) }; // eine einzelne Losung struct sLosung { sDate Date; std::string Losungstext; std::string Losungsvers; std::string Lehrtext; std::string Lehrtextvers; }; // alle eingelesenen Losungen std::vector<sLosung> Losungen; Ich würde zuerst alle Losungen aus der Datei einlesen und in einem Array speichern. Eine spätere Suche wird so sehr viel einfacher. Das ist nicht sehr kompliziert. Du brauchst also eine/mehrere Funktion(en), die die Datei zeilenweise einliest und nach bestimmten Tags sucht und diese auswertet (parsen). Ich würde in etwa folgendes tun: - finde das Tag <Losungen> (das Root-Tag einer Losung) - lese alle Zeilen bis </Losungen> jetzt haben wir alle relevanten Daten einer einzelnen Losung - finde das Tag <Datum> und lese bis </Datum> - parse das eingelesene Datum - finde das Tag <WTAG> und lese bis </WTAG> - parse den eingelesenen Wochentag ... Du siehst sicherlich wo das lang geht. Zu jeder fertig eingelesenen und geparsten Losung erstellst du eine Struktur, wie oben gezeigt und speicherst sie einem Array. Das ganze wiederholst du so lange, bis alle Losungen eingelesen sind und strukturiert in einem Array vorliegen. Anschließend brauchst du nur noch eine Funktion, die dir zu einem bestimmten Datum die entsprechende Losung aus dem Array raussucht. Ich hoffe das hilft dir etwas auf die Sprünge. Gruß Frobber Zitieren
Samara Geschrieben 23. April 2010 Autor Geschrieben 23. April 2010 P.S. Samara Morgan? Nein, das bin ich leider nicht ; ) Zitieren
Samara Geschrieben 23. April 2010 Autor Geschrieben 23. April 2010 Ich würde in etwa folgendes tun: - finde das Tag <Losungen> (das Root-Tag einer Losung) - lese alle Zeilen bis </Losungen> jetzt haben wir alle relevanten Daten einer einzelnen Losung Vielen Dank schonmal für den Lösungsvorschlag, hört sich ganz gut an ; ) Leider weiß ich nicht was Tags sind, und wie finde ich ein bestimmtes Tag in meiner Datei? also mit welchem Befehl? Lg Sami Zitieren
_n4p_ Geschrieben 23. April 2010 Geschrieben 23. April 2010 hi, also ein tag ist zB <Datum> in deiner XML datei. es gibt start und ende tags, start tag sieht aus wie das beispiel, ende tags haben ein / nach der <. also in dem beispiel </Datum>. alles was zwischen <Datum> und </Datum> steht ist dann der inhalt des tags, das können auch weitere tags sein. dann gibt es noch tags ohne ende tag, die müssen sich aber selbst schließen zB <Datum wert="1.1.2010" /> infos zu xml: Extensible Markup Language ? Wikipedia und XML Tutorial und google ^^ einen einfachen befehl, der nach tags sucht, bringt C++ nicht mit. daher der vorschlag mit den librarys. du müsstest also die eingelesene zeile nach < und > durchsuchen und dann entprechend dem wort dazwischen reagieren. das ganze wird jedenfalls nicht mit 10 zeilen code getan sein. Zitieren
Samara Geschrieben 23. April 2010 Autor Geschrieben 23. April 2010 einen einfachen befehl, der nach tags sucht, bringt C++ nicht mit. daher der vorschlag mit den librarys. du müsstest also die eingelesene zeile nach < und > durchsuchen und dann entprechend dem wort dazwischen reagieren. das ganze wird jedenfalls nicht mit 10 zeilen code getan sein. hi, danke schonmal. mit welchem befehl mache ich das denn? das mit den libraries kommt leider nicht infrage. Lg Mandy Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.