NOCHMALS: XML(ASCII-File) in C++ einlesen
-
Hallo,
bin immer noch nicht weiter gekommen seit meinem letzten Beitrag:
[url]
http://www.c-plusplus.net/forum/viewtopic.php?t=51273
[/url]Wie kann ich mit find() z.B. <Identity>98 aus dem ASCII-File finden und den Wert danach als int abspeichern?
ich hab's mit vector<string> Contents probiert und mit std::vector<string>::iterator pos=find(Contents.begin(), Contents.end(),"<Identity>")???Gibt es einen einfachen XML-Parser, wo man sich so einiges abschauen kann???
Oder könnt ihr mir einen Tipp geben???
-
Hallo,
kann mir denn keiner helfen???
Ciao
-
hm
habe dir ja im letzten thread schon den xerces angeboten..
da ist auch eine version mit quellcode dabei, also einsehbar..aber hast du sicher schon gecheckt
-
Hallo,
Da mein XML-File immer wieder die gleichen Start- und Endtags hat, kann ich mir nicht vorstellen, dass man dafür extra einen komplizierten XML-Parser braucht. Ich werde mir den Xerces nochmals anschauen, aber da sind soviele Dateien dabei ... für einen Anfänger ist das schon irgendwie nicht ganz so easy.
Ich möchte einfach den XML-File in C++ einlesen und z.B. für <Grafiktyp>100</Grafiktyp> die Position von 100 wissen. Dadurch könnte ich problemlos diesen Wert als int abspeichern.
-
hi
wenn es immer die gleichen tags sind, könnte man mit der stringklasse einen parser schreiben, aber sollten die tags auch flexibel sein, dann finde ich das selber bauen des parser nicht trivial...
ps: schau dir mal die funktionalitäten der neuen string klasse an, vielleicht reichen dir diese möglichkeiten der stringverarbeitung
-
Hallo,
so sieht meine Idee aus:
#include<iostream> #include<fstream> #include<vector> #include<string> #include<iterator> #include<algorithm> #include<assert.h> int main(){ FILE *fp; fp = fopen("test.xml","r"); char * start; char *end; char str[255]; char *name[] = {"<Identity>", "<GrfType>", "<Size>", "<RefColor>"}; int count = (sizeof(name)/sizeof(*name)); int x = 0; while(!feof(fp)) { fgets(str, 255, fp); if ((strstr(str,name[x])) && (x<count)) { start = strchr(str,'>')+1; end = strrchr(start,'<'); memset(end,'\0',1); x++; } } fclose(fp); return 0; }
Aber leider gibt mir start die Adresse von <,>, usw. aus und ich weiß nicht, wann z.B. die Zahl 30 von <Identity> dran ist (außer ich debugge)
-
ich meinte die neue string klasse aus dem namespace std;
nicht die etwas mühseelige c variante.hier ein link..
http://www.cppreference.com/cppstring.htmldort findest du funktionen wie : find, find_first_of() etc...
#include <string>
using namespace std;ps: und du kannst mit dem normalen == vergleich arbeiten
string str1="hallo";
string str2 = "hallo";
if(str1 == str2)
-
hallo,
bezueglich meiner vergleichsfrage :
Vergleich zwischen ((deque<string>::iterator)) und const char
habe ich folgende einleuchtende erklaerung von @virtuell Realisticer bekommen:const char *Test1 = "Hallo"; //Test1 zeigt, sagen wir mal, auf 0x0000000A const char *Test2 = "Hallo"; //Test2 zeigt, sagen wir mal, auf 0x00000020 ;) //vergleichen von Speicheradressen if(Test1 == Test2) //die adressen sind unterschiedlich (s. festlegung oben) std::cout<<"Zeigen auf gleiche Speicheradresse"<<std::endl; else std::cout<<"Zeigen auf unterschiedliche Speicheradresse"<<std::endl; //vergleichen der Zeichenketten (Hallo) if(strcmp(Test1,Test2)==0) //die zeichenketten sind identisch (s. o.) std::cout<<"Zeichenketten sind identisch"; else std::cout<<"Zeichenketten sind nicht identisch";
aus der ich schliesse, dass der vergleich
string str1="hallo"; string str2 = "hallo"; if(str1 == str2)
eher
if(strcmp(str1.c_str() , str2.c_str()) == 0)
heissen muessete, oder lieg ich da jetzt falsch?
aber by the way, ich bin (als lernprograemmchen) grad an was aehnlichem dran, ich parse html-tags und ueberpruefe sie auf korrektes auf- und zugehn. das heisst unterm strich, dass du dich zwar eher fuer das zwischen den tags interesiert, und ich mich fuer die tags selbst; aber wenn du was brauchst (so weit ist das nicht voneinander weg, oder?), lass mich wissen (mit der ausdruecklichen vorwarnung, dass ich anfaenger bin)
SF
-
Segmentation Faulter schrieb:
hallo,
aus der ich schliesse, dass der vergleichstring str1="hallo"; string str2 = "hallo"; if(str1 == str2)
eher
if(strcmp(str1.c_str() , str2.c_str()) == 0)
heissen muessete, oder lieg ich da jetzt falsch?
Ja. Mit "==" vergleicht man bei std::string die Zeichenkette und keine Adressen.