xml-parser



  • Hi Leute!

    Ich möchte einen XMl-Parser bauen. Ich übertrage die Textdatei in ein genügend großes Array. Das macht die Funktion initDoc();. Jetzt hab ich mir vorgestellt ich gehe Zeilenweise vor. Eine Zeile beginnt bei mir einer '<' und endet mit einer '>'. Die Zeichen darin übertrage ich in ein temporäres Array Namens "tmp". Was ich damit dann weiter anstelle sei mal noch dahingestellt. Nun hab ich folgendes Problem: Ich weiß jetzt grad nicht, wie ich der Funktion startTag beibringe, dass sie nach dem Zeichen '10', also das für LineFeed, nach nochmaligen Aufruf weiter machen soll.

    Der bisherige Code sieht so aus:

    #include<iostream>
    #include<fstream>
    using namespace std;
    
    void initDoc(char *file)
    {
    	int i = 0;
    	char zeichen;
    
    	ifstream Quelldatei;
    	Quelldatei.open("Aufgabe 2.xml", ios_base::in);
    
    	if(!Quelldatei)
    	{
    		cout << "Quelldatei kann nicht geoeffnet werden!" << endl;
    	}
    	else
    	{
    		while(Quelldatei.get(zeichen))
    		{
    			*file = zeichen;
    			file = file + 1;
    		}
    	}
    }
    
    void startTag(char *file, char *tmp, char *name, char *attr, char *val, char *attrNr)
    {
    	while(*file != '<')			//Zeile extrahieren
    	{
    		file = file + 1;
    	}
    	while(*file != '>')
    	{
    		*tmp = *file;
    		tmp = tmp + 1;
    		file = file + 1;
    	}
    
    	while(*tmp != '"')
    	{
    		tmp = tmp + 1;
    	}
    
    	tmp = tmp + 1;
    
    	while(*tmp != '"')
    	{
    		*name = *tmp;
    		tmp = tmp + 1;
    		name = name + 1;
    	}
    	*name = '\0';
    }
    
    int main()
    {
    	char file[1000], tmp[100], name[100], attr[100], val[100], attrNr[100];
    
    	initDoc(file);
    	startTag(file, tmp, name, attr, val, attrNr);
    
    return 0;
    }
    


  • vip@r schrieb:

    ...Ich möchte einen XMl-Parser bauen. .... Eine Zeile beginnt bei mir einer '<' und endet mit einer '>'.

    😕 😕😕 😕



  • Ja ich mein ein XML-File hat doch auch Zeilen. Deswegen.



  • Zeig mal einen Ausschnitt aus der zu parsenden Datei. Weiß nicht, wie es den anderen geht, aber ich hab "leichte" Schwierigkeiten zu verstehen was und wie du es machen willst.



  • <xxx name="blabla">
    
    		<hallo name="blub" du="123456" kilometer="123654"/>
    		<duda name="blab" hier="567" meter="432" istesklar="true"/>
    
    	</xxx>
    
    	<yyy name="blubbb">
    
    		<hallo name="blubbb" dudada="5678" windows="7234">
    		<smiley name="schwandorf"/>
    		<tasks name="themen"/>
    		</hallo>
    		<blähm name="dachelhofen" geraet="1236543" geschwindigkeit="111" istklar="true"/>
    
    	</yyy >
    

    Ist zwar jetzt ein ziemliches durcheinander aber so ist der grundsätzliche Aufbau!



  • Du tust gut daran, wenn du dafür eine fertige Lib verwendest. Selbst für XML lässt sich nicht "mal eben" ein Parser schreiben, der auch zuverlässig arbeitet. Und letzteres sollte bei dir hohe Priorität haben.



  • Hallo vip@r,

    tu dir selbst einen Gefallen und verwende einen fertigen XML-Parser (du scheinst dir nicht im Klaren zu sein, wie aufwändig so ein Parser ist --- geschweige denn, daß evtl. alles in einer Zeile stehen kann...), z.B.
    pugixml: http://pugixml.org/
    tinyxml: http://sourceforge.net/projects/tinyxml/
    tinyxml++: http://ticpp.googlecode.com/svn/docs/ticpp.html



  • vip@r schrieb:

    Ist zwar jetzt ein ziemliches durcheinander aber so ist der grundsätzliche Aufbau!

    Hm, ich ahne Böses. Kann es sein, dass das eine Aufgabe an der FH/Uni ist, für die ihr ein ganzes Semster Zeit hattet und übermorgen oder so ist Abgabe?

    Ansonsten schließe ich mich meinen Vorrednern an. Dein Ansatz "erschlägt" bzw. "erfasst" die Komplexität der Datei nicht. Damit kommst du nicht weit.



  • Du ahnst nichts böses. Das ist eine reine Übungsaufgabe für die ich so lange Zeit hab bis fertig bin. Es würde auch keinen jucken wenn ich es nicht bis zu den Prüfungen schaffe. Dass das ganze sehr umfangreich ist, ist mir klar. Hilfst du mir jetzt dennoch weiter?

    Ich hab halt leider schon Probleme damit mir da einen konkreten Ablauf zu basteln, nach dem ich dann "runter programmieren" könnte. Verstehst du was ich meine? Ich finde quasi keinen Zugang zur Aufgabe. Deshalb hab ich eben mal so angefangen, dass mir eine Funktion den Inhalt der Datei in ein großes Array schreibt mit dem ich dann weiter machen kann. Aber irgendwie wird das dann schon ziemlich schwierig, weshalb ich mich über konkrete schon ziemlich freuen würde!

    Der Code oben soll halt nun verdeutlichen wie ich mir das ganze mal so grob vorgestellt habe und bis jetzt tut er ja auch schon mal so viel, dass er mir im Starttag den Namen des Tags in ein temporäres Array schreibt. Aber wie differenziere ich nun weiter zwischen Starttag, Endtag, Attribut, Wert der Attribute usw... Das ist für mich echt schwierig!

    Was mir schon mal weiterhelfen würde, ist ein Programmgerüst, in dem alle Funktionen mit ihren Signaturen implementiert sind. Sprich: Welche Parameter erwartet werden zurückgegeben werden usw. Ich hab auch schon mal einen (wahrscheinlich) groben Ablaufplan gemacht. Wenn ihn jemand sehen will, dann kann ich den ja irgendwo als Bild hochladen!

    Danke!



  • Naja, fange erstmal an, die Struktur von Xml zu analyisieren.
    Grundsätzlich:
    Ein Tag fängt mit < an und hört mit > auf. So kannst du schonmal Tags identifizieren.
    Der Bezeichner eines Tags darf keine Leerzeichen enthalten. Hast Du ein Leerzeichen, fängt ein Attribut an.
    Auf den Namen des Attributs muss ein "=" folgen und danach ein String. Ob das nun ein int, bool oder nicht darstellt, kann dir erstmal egal sein.

    Damit kann man mit einfachen Stringvergleichen doch schonmal was anfangen.
    Eine gute Lib um das zu parsen wäre für den Anfang boost::tokenizer. Der kann dir das in Token zerlegen, die sich gut iterieren lassen.
    So würde ich an die Sache rangehen.

    edit: Schau dir mal irrXML an. Das hat nur 1 .cpp Datei und ist ein sehr einfacher, aber effektiver parser, den ich gerne verwende. Der ist zwar nicht OOP, aber dennoch solltest du eine Idee bekommen wie man sowas implementieren kann.



  • hat der Threadersteller etwa 2 Accounts? :p



  • _D schrieb:

    hat der Threadersteller etwa 2 Accounts? :p

    Jetzt, wo du es sagst 😃 👍


Anmelden zum Antworten