# XML in C++



## stevecmr (13. August 2007)

Hallo,

 ich habe ein kleines Problem. Meine C++ Kenntnisse sind sehr
eingeschränkt, für ein Projekt muss ich ein XML Dokument einlesen.
Ich habe jetzt schon ein paar Dinge versucht, aber irgendwo bin ich
immer gescheitert. Hat jemand ein paar Tips wie man möglichst leicht
XML Dokumente einlesen kann?
danke im vorraus
Steve


----------



## deepthroat (13. August 2007)

Hi.

Das geht eigentlich sehr einfach - mit der entsprechenden Bibliothek. Für Windows in Verbindung mit Visual C++ würde sich die Microsoft XML Bibliothek (msxml) anbieten. Für Dev-Cpp z.B. TinyXml.

Einfach mal hier im Forum und mit Google *suchen...*

Gruß


----------



## lordfritte (13. August 2007)

Kann TinyXml nur XML Dateien lesen oder kann man damit auch welche schreiben und verwalten?


----------



## deepthroat (13. August 2007)

lordfritte hat gesagt.:


> Kann TinyXml nur XML Dateien lesen oder kann man damit auch welche schreiben und verwalten?


Ein kurzer Blick in die Dokumentation beantwortet die Frage sofort: http://www.grinninglizard.com/tinyxmldocs/classTiXmlDocument.html#a7

Gruß


----------



## stevecmr (14. August 2007)

Hallo deepthroat erste mal danke, 
ich bin leider noch nicht damit durch und wenn ich die Oberfläche Eclipse benutze, gilt das auch noch?.Und wie soll ich diese tinyXML in meine Code einfügen?.

Also ich sollte folgendes XML Doc lesen
<grafen>
 <graf id =" 0">
   <x_werte> x_musterwerte </x_werte>
   <y_werte>y_musterwerte</y_werte>
   <z_werte>z_musterwerte</z_werte>
  </graf>
<graf id =" 1">
   <x_werte> x_musterwerte </x_werte>
   <y_werte>y_musterwerte</y_werte>
   <z_werte>z_musterwerte</z_werte>
  </graf>
      .
      .
      .

<graf id =" n">
   <x_werte> x_musterwerte </x_werte>
   <y_werte>y_musterwerte</y_werte>
   <z_werte>z_musterwerte</z_werte>
  </graf>
</grafen>

danke in Vorraus


----------



## deepthroat (14. August 2007)

Hi.

Im Grunde ist es egal welche IDE du verwendest. Allerdings musst du dich schon selbst damit auskennen wie die IDE funktioniert und wo man etwas einstellt. Das ist ja bei Eclipse (/CDT) kein Problem, da sich jede Menge Tutorials, HowTos und "Webinare" finden lassen.

Obwohl bereits in der TinyXml Distribution Beispiele enthalten sind, hier mal ein Minimalbeispiel:
	
	
	



```
#include <cstdlib>
#include <iostream>

#include "tinyxml/tinyxml.h"

using namespace std;

int main(int argc, char *argv[])
{
    TiXmlDocument doc("demo.xml");
    
    if (doc.LoadFile())
    {
       TiXmlNode* element = doc.RootElement();
       while (element != 0) {
             cout << element->Value() << endl;
             
             element = element->FirstChild();
       }
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
```
Die TinyXml Archivdatei kannst du einfach in das Verzeichnis von deinem Projekt entpacken. Dann muss man lediglich noch die tinyxml Bibliothek beim Linken angeben.

Gruß


----------



## lordfritte (14. August 2007)

Also bei mir geht das Beispiel nicht, Dev-Cpp gibt mir einen Haufen Fehler:

```
[Linker error] undefined reference to `TiXmlDocument::TiXmlDocument(char const*)' 
  [Linker error] undefined reference to `TiXmlDocument::LoadFile(TiXmlEncoding)' 
  [Linker error] undefined reference to `vtable for TiXmlDocument' 
  [Linker error] undefined reference to `TiXmlNode::~TiXmlNode()' 
  [Linker error] undefined reference to `TiXmlNode::~TiXmlNode()' 
  [Linker error] undefined reference to `TiXmlString::nullrep_' 
  [Linker error] undefined reference to `TiXmlNode::FirstChildElement() const' 
  ld returned 1 exit status
```

EDIT: Visual C++ Express 2005 Compiliert es auch nicht, warum funktionieren Beispiele nie


----------



## deepthroat (14. August 2007)

lordfritte hat gesagt.:


> Also bei mir geht das Beispiel nicht, Dev-Cpp gibt mir einen Haufen Fehler:
> 
> ```
> [Linker error] undefined reference to `TiXmlDocument::TiXmlDocument(char const*)'
> ...


Wie bereits gesagt muss selbstverständlich die tinyxml Bibliothek zum Projekt gelinkt werden. In Dev-Cpp kann man übrigens die TinyXml Entwicklungsdateien mittels Tools->Update Manager installieren. Zum Hinzulinken der Bibliothek reicht es dann in den Projektoptionen auf der Parameter Lasche für den Linker die Option "-ltinyxml" einzufügen.

Gruß


----------



## lordfritte (14. August 2007)

Oh hatte ich überlesen sorry, naja jetzt gibt es neue Fehler:

```
multiple definition of `TiXmlNode::FirstChildElement()' 
  first defined here 
  [Linker error] undefined reference to `TiXmlString::nullrep_' 
  ld returned 1 exit status
```

Naja immernoch ein Linker error, obwohl ich das nun eingebunden habe....


----------



## deepthroat (14. August 2007)

lordfritte hat gesagt.:


> Oh hatte ich überlesen sorry, naja jetzt gibt es neue Fehler:
> 
> ```
> multiple definition of `TiXmlNode::FirstChildElement()'
> ...


Kann es sein, das du TinyXml in des Dev-Cpp Projekt eingebunden hast? 

Ist das die vollständige Fehlermeldung? In welchen Dateien werden denn die doppelten Definitionen angezeigt?

Gruß


----------



## lordfritte (15. August 2007)

Ich habe nur das "#include "tinyxml/tinyxml.h"" und in welcher Datei die Definitionen ist sagt er nicht.

EDIT: Wenn ich die headerdatei über "#include <tinyxml.h>" einbinde läuft es, komisch ist nur das sich das Programm mit einem Absturz verabschiedet.


----------



## deepthroat (15. August 2007)

lordfritte hat gesagt.:


> Ich habe nur das "#include "tinyxml/tinyxml.h"" und in welcher Datei die Definitionen ist sagt er nicht.
> 
> EDIT: Wenn ich die headerdatei über "#include <tinyxml.h>" einbinde läuft es, komisch ist nur das sich das Programm mit einem Absturz verabschiedet.


Ja, das ist merkwürdig. Was gibt das Programm denn aus? In welcher Zeile tritt der Fehler auf / stürzt das Programm ab? Und welche Version von TinyXml benutzt du eigentlich?

Gruß


----------



## lordfritte (15. August 2007)

Also ich habe die demo.xml genommen und es gibt folgendes aus:

```
grafen
graf
x_werte
x_musterwerte
```

nachdem ich es mit der Eingabetaste schließe, stürzt es mit der Windowsmeldung: "xml.exe funktioniert nicht mehr" ab, in welcher Zeile der Fehler verursacht wird wird nicht angezeigt.
Ich benutze die Version 2.3.4


----------



## deepthroat (15. August 2007)

lordfritte hat gesagt.:


> nachdem ich es mit der Eingabetaste schließe, stürzt es mit der Windowsmeldung: "xml.exe funktioniert nicht mehr" ab, in welcher Zeile der Fehler verursacht wird wird nicht angezeigt.


Du kannst ja mal mit dem Debugger schrittweise durch das Programm durchgehen.


lordfritte hat gesagt.:


> Ich benutze die Version 2.3.4


Die ist natürlich auch schon reichlich alt. Die aktuelle ist 2.5.3, die davor 2.4.0 vom 08.10.2005.

Gruß


----------



## lordfritte (15. August 2007)

Naja ich benutze das was, dev-c++ herunter geladen hat.


----------



## deepthroat (15. August 2007)

lordfritte hat gesagt.:


> Naja ich benutze das was, dev-c++ herunter geladen hat.


Ok, ich auch. Ich bekomme aber keinen Fehler oder irgendeine Meldung. Kann es sein, das du kein Konsolenprojekt erstellt hast?

Gruß


----------



## lordfritte (15. August 2007)

Ja, aber das ist doch ein Konsolen Programm


----------



## deepthroat (15. August 2007)

lordfritte hat gesagt.:


> Ja, aber das ist doch ein Konsolen Programm


Hast du nun ein Konsolenprojekt gemacht oder nicht?! Lass dir doch nicht alles aus der Nase ziehen... 

Gruß


----------



## lordfritte (15. August 2007)

Ja ich habe doch gesagt Ja, also ja ich habe ein Konsolen Programm gemacht, ja


----------



## stevecmr (22. August 2007)

Hi lordfritte,
hast du denn eine Makefile dafür geschrieben oder machst du alles manuel, ich bekomme es nicht gebacken.Und wenn ja wie sieht es aus?.Wie binde ich meine Lib? indem ich alle *.cpp und *.h in der gleich ordner mein Program setze?.
LG


----------



## lordfritte (22. August 2007)

Mein dev-C++ macht die makefiles automatisch.
Ich wüsste aber auch gerne mal wo man eine aktuelle lib herbekommt.


----------



## deepthroat (22. August 2007)

stevecmr hat gesagt.:


> Hi lordfritte,
> hast du denn eine Makefile dafür geschrieben oder machst du alles manuel, ich bekomme es nicht gebacken.Und wenn ja wie sieht es aus?.Wie binde ich meine Lib? indem ich alle *.cpp und *.h in der gleich ordner mein Program setze?.


Wie in der TinyXml Dokumentation beschrieben, kann man einfach die 2 Header und 4 .cpp Dateien zu seinem Projekt hinzufügen, so das diese mitkompiliert und gelinkt werden.

Man kann natürlich auch eine Bibliothek erstellen.


lordfritte hat gesagt.:


> Mein dev-C++ macht die makefiles automatisch.
> Ich wüsste aber auch gerne mal wo man eine aktuelle lib herbekommt.


Die kannst du ganz einfach aus dem Quellcode selbst erstellen. Auf der Kommandozeile wechselst du in das tinyxml Verzeichnis wo die Quelldateien liegen und gibst "make" ein. Du mußt natürlich sicherstellen, dass der Pfad zum Compiler (im Dev-Cpp\bin Verzeichnis) etc. gesetzt ist.

\edit: Da hab ich wohl zu früh gesprochen. Das Makefile erstellt keine .lib Datei - es erstellt nur Objektdateien und ein Test-Programm. Um eine .lib zu erstellen: 
	
	
	



```
ar r libtinyxml.lib *.o
```

Gruß


----------



## stevecmr (23. August 2007)

Hi deepthroat,
wenn ich deine oben gebene Code ausführe( im consol mir cygwin) dann bekomme ich folgende Meldungen:
g++ -c main.cpp -Wall -Wno-format -g -DDEBUG tinyxml.cpp -o tinyxml.o
tinyxml.cpp:31 sstream: No such file or directory
In file included from tinyxml.cpp:34:
tinyxml.h:51: sstream: No such file or directory
make: ***[tinyxml.o] Error 1

ich habe mir die make die in Tinyxml ist benutzte und mir auf die beispiel angepasst.
Ich habe suche auch mit dev-c++ zu kompiliert und immer Erfolglos.
Danke im vorraus.
Gruss


----------



## deepthroat (23. August 2007)

stevecmr hat gesagt.:


> Hi deepthroat,
> wenn ich deine oben gebene Code ausführe( im consol mir cygwin) dann bekomme ich folgende Meldungen:
> g++ -c main.cpp -Wall -Wno-format -g -DDEBUG tinyxml.cpp -o tinyxml.o
> tinyxml.cpp:31 sstream: No such file or directory
> ...


Welche Version von g++ benutzt du denn? (g++ --version)

Du kannst ja mal versuchen ohne STL zu kompileren (ist eine Einstellung in dem Makefile).

Gruß


----------



## stevecmr (23. August 2007)

moin, ich habe mir MinGW-5.1.3 runtergeladen und installiert, ich habe auch den Path eingelegt.Dann mir auch cygwin installiert damit ich commando befehl ausführen kann.Wenn ich einfach c++ Program ausführe dann geht es ohne problem aber nicht das obige Program.
TINYXML_USE_STL := NO , ich habe auch versucht diese Zeite in Makefile zu ändern aber geht es immer nicht.Soll ich irgendwie  noch was einbinden?
Gruss?.


----------



## deepthroat (23. August 2007)

stevecmr hat gesagt.:


> moin, ich habe mir MinGW-5.1.3 runtergeladen und installiert, ich habe auch den Path eingelegt.Dann mir auch cygwin installiert damit ich commando befehl ausführen kann.Wenn ich einfach c++ Program ausführe dann geht es ohne problem aber nicht das obige Program.
> TINYXML_USE_STL := NO , ich habe auch versucht diese Zeite in Makefile zu ändern aber geht es immer nicht.Soll ich irgendwie  noch was einbinden?


Nein, sstream ist ein Header der C++ Standard Template Library (STL). Wenn der nicht gefunden wird hast du entweder einen zu alten Compiler oder irgendwas ist nicht richtig installiert. Da bei MinGW 5.1.3 der GCC 3.4.2 dabei ist, kann es nicht am Alter des Compilers liegen.

Sehr merkwürdig ist, dass du MinGW und Cygwin gleichzeitig installiert hast (was durchaus möglich ist), aber du vermutlich den MinGW Compiler von Cygwin aus startest.

Für MinGW solltest du MSYS installieren, oder du installierst unter Cygwin den C++ Compiler und kompilierst da.

Gruß

PS: Es wäre übrigens sehr hilfreich, wenn du das was du gemacht hast nicht beschreibst, sondern einfach zeigst was du gemacht hast. Und außerdem hast du die Frage nach der Compilerversion nicht beantwortet. Du hättest doch einfach nur die Ausgabe von g++ --version zitieren müssen...


----------



## stevecmr (23. August 2007)

Hi deepthroat, ich benutze gcc version 3.4.2. ich habe mir mal auch MSYS installiert und versuche erste mal damit ob es klappen könnte.
Also bis dann


----------



## lordfritte (24. August 2007)

Danke hat funktioniert, wie bindet man lib-Dateien in Visual C++ Epress ein?


----------



## lordfritte (23. September 2007)

Ich hab noch ein Problem, wenn ich was mit CodeBlocks Compilieren möchte kommt dies:

```
-------------- Build: Debug in tinyxml ---------------
Compiling: main.cpp
Linking console executable: bin\Debug\tinyxml.exe
obj\Debug\main.o: In function `ZN11TiXmlString4quitEv':C:/MinGW/include/tinystr.h:(.text$_ZN11TiXmlString4quitEv[TiXmlString::quit()]+0xb): undefined reference to `TiXmlString::nullrep_'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
```

Hier der code:

```
#include <iostream>
#include "tinyxml.h"

using namespace std;

int main()
{

    TiXmlDocument doc("test.xml");

    cout << "Hello world!" << endl;
    return 0;
}
```


----------

