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
aufteiltGruß
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