Zum Inhalt springen

XML einlesen


Samara

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...