C++ TinyXML
-
Hi Leute
Ich versuch ein einer Datei die Anzahl von Namen herraus zu finden. Ich hab in einer Datei stehen.
Beispiel:<1NAME>asdas</1NAME> <2NAME>asdas</2NAME> <3NAME>asdas</3NAME> <4NAME>asdas</4NAME>Jetzt möcht ich herrausfinden wie viele Namen es gibt denn es werden immer unterschiedlich viel geben.
Hier noch der Quelltext:
game.hpp#ifndef GAME_HPP_INCLUDED #define GAME_HPP_INCLUDED #define MYSQLPP_MYSQL_HEADERS_BURIED #include <mysql++/mysql++.h> #define TIXML_USE_STL #include <tinyxml.h> #include <string> #include <sstream> class Game { public: int self_list(); }; #endif // GAME_HPP_INCLUDEDgame.cpp
#include "game.hpp" int Game::self_list() { int i, anzahl; std::string search_number, name; TiXmlDocument doc("./config/self.conf"); TiXmlNode *search_elem; if(!doc.LoadFile()) { return -1; } for(i=1; search_elem != 0; i++) { std::ostringstream outstream; outstream << i; search_number = outstream.str(); name = search_number + "NAME"; search_elem = doc.FirstChild(name); std::cout << name << std::endl; anzahl = i; } return anzahl; }Ich hoffe ihr wisst was ich meine und könnt mir helfen.
Gruß,
Nico
-
1. Durchgang: name == 1NAME, ist vorhanden, anzahl = 1, search_elem !=0
2. Durchgang: name == 2NAME, ist vorhanden, anzahl = 2, search_elem !=0
3. Durchgang: name == 3NAME, ist vorhanden, anzahl = 3, search_elem !=0
4. Durchgang: name == 4NAME, ist vorhanden, anzahl = 4, search_elem !=0
5. Durchgang: name == 5NAME, ist nicht vorhanden, anzahl = 5, search_elem ==0 --> Abbruch5 wird ausgegeben ... höchstens die Logic ist schief ... aber die war schon bei dem XML Input schräg

-
Und worin liegt das Problem? Und wer macht eine XML Datei mit mehreren gleichen Elementen, gibt aber jedem Element einen anderen Namen?
Grüssli
-
Statt Xml-Elemente mit unterschiedlichem Name zu produzieren, wäre es deutlich besser, die Zahl wegzulassen. Willst du eine identifizierung zulassen, gibt dem Element ein Attribut "Nummer".
<NAME>asdas</NAME> <NAME>asdas</NAME> <NAME>asdas</NAME> <NAME>asdas</NAME> // Und mit Attributen: <NAME Nummer="1">asdas</NAME> <NAME Nummer="2">asdas</NAME> <NAME Nummer="3">asdas</NAME> <NAME Nummer="4">asdas</NAME>Zum Abzählen einfach in der Schleife die "FindNextElement("NAME")"-Funktion aufrufen (weiß nicht wie die bei TiXML heißt, evtl. gibts ja sogar nen NodeIterator - vllt. sogar gleich mit passendem Filter für die NodeName :)).
-
Ja stimm zu das die namens wahl nich gerade gut ist :D.
Mein Problem ist das bei mir nur 2 Element ausgegeben werden und dann wird abgebrochen.@ l'abra d'or
Ich weiß nicht ob es sowas gibt wie FindNextElement("NAME") in Tinyxml gib muss ich mal schauen.Edit:
Ich hab deswegen verschiedene Zahlen vor NAME weil ich später eine auflistung hab mit den Namen der Spiele und wenn man auf die Namen der Spiele klickt wird das Spiel gestartet.
-
gamebuntu schrieb:
Ich hab deswegen verschiedene Zahlen vor NAME weil ich später eine auflistung hab mit den Namen der Spiele und wenn man auf die Namen der Spiele klickt wird das Spiel gestartet.
Macht immer noch keinen Sinn. In diesem Fall wäre es wohl eher sowas:
<Games> <Game Name="Landwirtschaft-Simulator" Path="X:/some/garbage.exe" /> <!-- ... --> </Games>Wenn du willst, kannst du jedem Game-Element noch eine ID verpassen. Aber speichere nie Daten in den Namen eines Elements.
Grüssli
-
Also die Zahlen sollten eigendlich die ID sein.
@ Dravere
Dein Beispiel gefällt mir ich versuch das umzu setzen danke.
-
Ich würde dir statt TinyXml Boost.PropertyTree empfehlen:
http://www.boost.org/doc/libs/1_44_0/doc/html/property_tree.html
http://www.boost.org/doc/libs/1_44_0/doc/html/boost_propertytree/parsers.html#boost_propertytree.parsers.xml_parser
-
Oberon_0 schrieb:
Ich würde dir statt TinyXml Boost.PropertyTree empfehlen:
http://www.boost.org/doc/libs/1_44_0/doc/html/property_tree.html
http://www.boost.org/doc/libs/1_44_0/doc/html/boost_propertytree/parsers.html#boost_propertytree.parsers.xml_parserWieso nicht gleich RapidXML?
Grüssli