Regex um den Inhalt zwischen zwei XML Tags auszulesen



  • Hallo zusammen,
    ich habe bis jetzt noch nie regex benutzt und muss den Inhalt zwischen zwei beliebigen XML-Tags auslesen. Kann mir jemand ein Coding-Beispiel posten?

    Danke im Voraus.



  • Hat XML nicht eine links-rekursive Grammatik?
    Wenn, dann wirst du mit Regex nicht weit kommen.



  • Sone schrieb:

    Hat XML nicht eine links-rekursive Grammatik?
    Wenn, dann wirst du mit Regex nicht weit kommen.

    Ich weiß zwar nicht was du genau mit links-rekursiven Grammatik meinst, aber ich meine Beispiele im Internet gesehen zu haben.

    Was ich genau brauche ist der Inhalt zwischen zwei XML-Tags.
    z.B. <meintag id="89"> derWertDenIchBrauche</meintag>. Die Problematik die dabei entsteht das je nach XML-String diese id auch 3 oder 4-stellig sein kann. Aus diesem Grund ist ein substring nicht ganz praktikabel. Deswegen war meine Idee es mit regex zu versuchen.

    Hat einer eine Idee wie man es sonst lösen kann?



  • Hmm, bin auch nicht der Experte. Kannst mal die RegEX hier probieren

    \w+<\/meintag>
    

    musst dann halt noch am Ende was auslassen, aber ist ja dann alles bekannt.

    Wenn du selbst mal testen willst, dann kann ich dir die Seite hier empfehlen:
    http://regexp-tester.mediacix.de/exp/regex/



  • Eine Möglichkeit (wobei "meintag" alles mögliche sein kann und einfach nur überlesen wird):

    <.{1,} id="\d{1,}">(.{1,})<\/.{1,}>

    Ich mag http://rubular.com/ ganz gerne.

    Edit: Wenn du echt nur den Inhalt brauchst, dann überspring alles andere einfach (wär aber irgendwie unlogisch..)

    <.{1,}>(.{1,})<\/.{1,}>

    Und mit nem Tag halt

    <tag.*>(.{1,})<\/tag>



  • Ach, und den Fall das zwischen den XML-Tags noch weitere sind, gibt es nicht? Ach na dann ist das was völlig anderes.



  • Hat er nix von geschrieben.



  • .. ich wollte schon immer reguläre Ausdrücke lernen 😉

    das kleine Beispiel:

    #include <iostream>
    #include <string>
    #include <regex>
    
    int main()
    {
        using namespace std;
        string str("<meintag id=\"89\"> derWertDenIchBrauche</meintag>");
        cmatch res;
        regex rx("<(.+)( +=\".*\")*>([^<]+)");
        regex_search( str.c_str(), res, rx );
        for( size_t nr=1; nr<=res.size(); ++nr )
            cout << res[nr] << "|";
        cout << endl;
        return 0;
    }
    

    hat folgende Ausgabe (Visual Studio 10)

    meintag id="89"|| derWertDenIchBrauche||
    

    wobei ich keinen Plan habe, wieso der Reguläre Ausdruck das genau so auf die Ergebnis-Variablen in res aufteilt 😕

    Gruß
    Werner



  • Naja ok dann eben so:

    #include <boost/regex.hpp>
    #include <iostream>
    
    int main()
    {
        std::string s = "<meintag id = \"123\">hallo</meintag>";
        boost::regex regex("<(\\w{1,}).*\"(\\d{1,})\">(.*)<\\/.*>");
        boost::cmatch matches;
        boost::regex_search(s.c_str(), matches, regex);
        std::cout << "Tag: " << matches[1] << "\n"
                     "Id: " << matches[2] << "\n"
                     "Wert: " << matches[3] << "\n";
    }
    

    Weißt ja, in C++ ist \\ = \.
    Ausgabe:

    Tag: meintag
    Id: 123
    Wert: hallo


Anmelden zum Antworten