Teilstring suchen



  • Hallo,
    und zwar hole ich mir eine XML-Struktur in einen string. Aus diesem string bzw. der XML-Struktur brauche ich dann den Eintrag eines Elements, also einen Teilstring. Bsp.:

    <id>123456</id>
    

    Hier möchte ich nur die 123456 haben. Vor und nach der ID stehen noch einige andere Einträge. Da es sein kann, dass sich die XML-Struktur mal ändert und auch die Länge der ID unterschiedlich sein kann, muss ich also ab dem Tag <id> bis zum Tag </id> suchen. Wie kann ich sowas mit C++ Boardmitteln machen? Wollte, wenn möglich, den Weg über einen XML-Parser umgehen.


  • Mod

    Wenn es richtig sein soll, dann musst du das XML parsen. Was wäre denn, wenn das "<id>" in irgendeinem anderen Zusammenhang im Dokument vorkommt? XML ist doch gerade dazu da, dass, wenn es richtig geparsed wird, solche Fälle kein Problem darstellen. Du musst den Parser ja auch nicht selber schreiben, die gibt es wie Sand am Meer.

    Wenn du wirklich die XML-Struktur ignorieren möchtest: string::find?



  • Das <id> taucht nur einmal auf in der Struktur. Wollte es eben über Boardmittel machen, da es ja nur für den einen Zweck ist. Mit XML-Parsern kenn ich mich gleich gar nicht aus 😕 mit der string-Funktion find habe ich bisher keinen Erfolg gehabt. Wahrscheinlich stell ich mich zu dumm an 😕


  • Mod

    xXMartinoXx schrieb:

    Das <id> taucht nur einmal auf in der Struktur.

    Klar, das sagst du jetzt. Wie ist das in ein paar Wochen, wenn du diesen Bequemlichkeitshack längst vergessen hast, aber ein neues Feld an ganz anderer Stelle in das Dokument einfügst? Oder wenn jemand anderes dein Dokument bearbeitet? "id" ist nun nicht gerade ein Schlüssel, von dem man erwarten würde, dass er kein zweites Mal benutzt wird.

    mit der string-Funktion find habe ich bisher keinen Erfolg gehabt.

    Dann wirst du wohl etwas falsch machen. Was erwartest du als Antwort auf solch eine Frage?
    http://www.tty1.net/smart-questions_de.html



  • SeppJ schrieb:

    xXMartinoXx schrieb:

    Das <id> taucht nur einmal auf in der Struktur.

    Klar, das sagst du jetzt. Wie ist das in ein paar Wochen, wenn du diesen Bequemlichkeitshack längst vergessen hast, aber ein neues Feld an ganz anderer Stelle in das Dokument einfügst? Oder wenn jemand anderes dein Dokument bearbeitet? "id" ist nun nicht gerade ein Schlüssel, von dem man erwarten würde, dass er kein zweites Mal benutzt wird.

    mit der string-Funktion find habe ich bisher keinen Erfolg gehabt.

    Dann wirst du wohl etwas falsch machen. Was erwartest du als Antwort auf solch eine Frage?
    http://www.tty1.net/smart-questions_de.html

    Das tag heißt auch nicht <id> Ich hatte es ja nur als Beispiel so genannt und es ist mehr als unwahrscheinlich das es irgendwo nochmal auftaucht.

    Ich poste jetzt mal das was bisher funktioniert:

    string element="<hasp id";
    string::size_type i = complStruct.find(element);
    
    string id=complStruct.substr(i+10,9);
    return id;
    

    Damit bekomme ich zumindest die Startposition und somit meine id raus. Nun möchte ich den zweiten Parameter len aber nicht fest vorgeben, da die id auch mal eine Stelle mehr oder weniger haben kann. Wie kann ich das also noch so machen, dass es nur bis zu dem Zeichen nach der id sucht? Kann ich dann überhaupt substr nehmen?



  • Vielleicht bringt das was:

    #include <iostream>
    #include <regex>
    using namespace std;
    
    int main(){
    	regex re("<id>(.*)</id>");
    	cmatch m;
    	if (regex_search("sadfskjdaf k<id>MeineID</id>sdkjnföskdhnfkjsan", m, re))
    		cout << m[1] << '\n';
    	else
    		cout << "not found\n";
    }
    //ausgabe VS2010: MeineID
    //ausgabe gcc 4.8.1: not found
    

    Ich habe gelesen, dass der gcc keine richtige Implementierung für regex hat, aber das sollte sich bald ändern.



  • xXMartinoXx schrieb:

    Damit bekomme ich zumindest die Startposition und somit meine id raus. Nun möchte ich den zweiten Parameter len aber nicht fest vorgeben, da die id auch mal eine Stelle mehr oder weniger haben kann. Wie kann ich das also noch so machen, dass es nur bis zu dem Zeichen nach der id sucht? Kann ich dann überhaupt substr nehmen?

    Du kannst auch noch nach <\id> suchen und du kennst die Länge von <id>.
    Ein bisschen rechnen und du weißt wie lange Text zwischen > und < ist.

    In deinem Beispiel suchst du ja nach "<hasp id" ohne >.
    Nach dem > kannst du dann ja auch noch suchen. Danach fängt dein string an.


  • Mod

    xXMartinoXx schrieb:

    Damit bekomme ich zumindest die Startposition und somit meine id raus. Nun möchte ich den zweiten Parameter len aber nicht fest vorgeben, da die id auch mal eine Stelle mehr oder weniger haben kann. Wie kann ich das also noch so machen, dass es nur bis zu dem Zeichen nach der id sucht? Kann ich dann überhaupt substr nehmen?

    Dann such doch nach dem Abschlusstag!

    Nochmal die Warnung, dass ein Patternmatching nicht geeignet ist, um verschachtelte Strukturen zu durchsuchen. Das gilt auch für regex! Auch wenn du diesen Ratschlag jetzt ignorierst, so kannst du später nicht mehr sagen, dass du nicht gewarnt worden wärst.
    Ich verweise auch noch einmal auf folgenden Beitrag. Geht zwar um HTML und regex, aber das ist letztlich die gleiche Art von Problemstellung:
    http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454



  • char* s = "<id>123456</id>";
    	int num;
    	char buf[128]={0};
    	sscanf(s, "<id>%d</id>", &num);
    	itoa(num, buf, 10);
    	puts(buf);
    

    rofl



  • kakk schrieb:

    ...
    

    IHHH, das ist ja C .... 🤡


Anmelden zum Antworten