Anderl72 0 Report post Posted January 30, 2004 Hallo, ich möchte xml seiten in die Datenbank aufnehemn, stehe etwas auf dem Schlauch Beispiel: XML Seite Der Inhalt zwischen den Tags soll in der Datenbank gespeichert werden. Wei kann ich das umsetzen? Jeder Vorschlag ist äusserst willkommen !!! Greetz Anderl Share this post Link to post
Stefan 0 Report post Posted January 30, 2004 Also nur die Informationen, die im Dokuemnt angegeben sind? Schon mal an reguläre Ausdrücke gedacht? Damit könnte man sowas relativ einfach herausfiltern. Jedenfalls wenn auf jeder Seite, die gleichen Tags vorhanden sind. Share this post Link to post
Anderl72 0 Report post Posted January 30, 2004 Schon mal an reguläre Ausdrücke gedacht? Damit könnte man sowas relativ einfach herausfiltern. Jedenfalls wenn auf jeder Seite, die gleichen Tags vorhanden sind. die tags sind die gleichen, mir geht es in dem beispiel um den <RK> Tag (Google Pagerank) und den <lastcrawl> Tag (der letzte Besuch des Googlebots). Dabei sollten unter anderem der Inhalt der Tags in die db geschrieben werden. Leider sagen mir reguläre Ausdrücke gar nichts, aber ich werd mich versuchen mal schlau machen Danke für den hint !!! Share this post Link to post
Stefan 0 Report post Posted January 30, 2004 Schau mal zum Beispiel hier, da wird es eigentlich erklärt. ;) Share this post Link to post
Anderl72 0 Report post Posted January 30, 2004 ohje, an dem preg_match hab ich mir gestern schon die zähne ausgebissen. Ich verstehe einfach nicht was es mit "/" und "\" auf sich hat. Ich bin wohl zu dumm dazu ich lese nochmal weiter :D Share this post Link to post
Stefan 0 Report post Posted January 30, 2004 Also mit \ nimmst du dem Zeichen den Sonderstatus bzw. wird es benutzt, um bestimmte Zeichen einen Status zu geben. Okay, nun ist die Verwirrung perfekt. Beispiel, du willst in einem Text nach dem Zeichen * suchen, nur ist es ja ein Suchausdruck bei regulären Ausdrücken. Es steht für eine Anzahl von 0 bis beliebig. Um aber nach dem Zeichen zu suchen, muß du es mit dem Backslash diesen Status enziehen, sprich \* schreiben. Das Slash / hat keinen Status, es muß nur der reguläre Ausdruck von einem Zeichen eingerahmt sein, also sowas wie Anführungszeichen. Du kannst natürlich auch # oder sonst was nehmen, meistens wird aber das Slash genommen. Mal ein Beispiel, du willst prüfen, ob der Inhalt einer Variable nur aus Zahlen besteht und mindestens eine Zahl muß vorhanden sein. Alle Zahlen werden durch \d kenntlich gemacht. Anzahl von mindestens 1 bis beliebig wird durch + kenntlich gemacht. Und nun muß man noch sicher gehen, das vom Anfang ^ bis Ende $ des Strings nur Zahlen sind. Der reguläre Ausdruck würde dann so aussehen: /^\d+$/ Also ganz einfach. :lol: Share this post Link to post
Anderl72 0 Report post Posted January 30, 2004 wenn ich das richtig verstanden habe, dann müsste aus <RK>7</RK> ja "/<RK>^\d1$<\RK>/" werden ?!?! stimmt leider nicht, was mache ich den falsch. Dabei war deine Erklärung so gut Noch ein anderes Problem tritt auf. Ich habe vorher die xml seite aufgerufen über $fh = fopen ("http://www.google.com/search?client=navclient-auto&ch=51123608106&q=info:http%3A%2F%2Fwww%2Et-online%2Ede%2F", 'r'); fpassthru($fh); fclose($fh); Wenn ich nun mit preg_match den RK rausfiltern will (mal abgesehen vom falschen string pattern) $fh = fopen ("http://www.google.com/search?client=navclient-auto&ch=51123608106&q=info:http%3A%2F%2Fwww%2Et-online%2Ede%2F", 'r'); fpassthru($fh); if (preg_match ("/<RK>^\d1$<\RK>/" , "$fh")) { print "pagerank 7"; } else { print "pagerankt not 7"; } fclose($fh); bekomme ich die Meldung, dass "Ungültig auf der obersten Ebene im Dokument. Fehler beim Bearbeiten der Ressource 'http://localhost/test2.php'. Zeile 13, Position 7 ...." Im Quelltext befindet sich jedoch das xml Dokument und dann noch die "Meldung pagerankt not 7", also die negierung der if schleife. Hier ist der quelltext: <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <!DOCTYPE GSP SYSTEM "google.dtd"> <GSP VER="3.2"> <TM>0.039058</TM><Q>info:http://www.t-online.de/</Q> <PARAM name="client" value="navclient-auto" original_value="navclient-auto"/> <PARAM name="ch" value="51123608106" original_value="51123608106"/> <PARAM name="q" value="info:http://www.t-online.de/" original_value="info:http%3A%2F%2Fwww.t-online.de%2F"/> <RES SN="1" EN="1"> <M>1</M> <XT/> <R N="1"><U>http://www.t-online.de/</U><UE>http://www.t-online.de/</UE><T>T-Online</T><RK>7</RK><CRAWLDATE> 28 Jan 2004</CRAWLDATE> <S>Sie sind hier: Startseite. Suche im Internet:<br> deutsch weltweit Produkte Profisuche Hilfe. <b>...</b> </S><LANG>de</LANG><HAS><DI><CAT><GN>gwd/Top/World/Deutsch/Computer/Internet/Internetzugang</GN> <FVN>Top/World/Deutsch/Computer/Internet/Internetzugang</FVN></CAT> <DT>T-Online</DT><DS>T-Online Internet, Deutsche Telekom AG</DS></DI><L/> <C SZ="44k" CID="b-wfSs2u4OgJ"/><RT/></HAS></R> </RES> </GSP> pagerankt not 7 Die Meldung kommt beim printen aber auch beim updaten der DB, warum? Was soll das mit der obersten ebene? geht das überhaupt so wie ich mir das vorstelle? Vielen Dank Anderl P.S sorry für das bouncen, ich weis auch nicht wie das passieren konnte?!?! Share this post Link to post
Stefan 0 Report post Posted January 31, 2004 Okay, ich seh schon, das beim Einlesen schon ein paar Verständnisprobleme auftreten. Mit dem Befehl fpassthru gibst du den Inhalt der Datei aus und schließt den Zeiger, der auf die Datei zeigt wieder. Somit ist deine Variable $fh danach nicht mehr brauchbar und außerdem kann man diese auch nicht so verwenden. Ich kenne da aber eine PHP Klasse mit der man eine Art Webbrowser simulieren kann und dann brauchst du dich auch nicht mehr mit den Einzelheiten für das Auslesen beschäftigen. Ein Hoch auf OOP. Finden kannst du die Sache hier und ich zeig gleich mal, wie man damit arbeitet. Nun zu deinem Problem. Du möchtest den Wert zwischen und auslesen, was anscheinend nur eine bzw. mehrere Zahlen sind. Dies wäre dann eine Gruppe, die man mit () umschließt, was ich nioch nicht gesagt habe. Zahlen werden ja mit \d gesucht (nebenbei, Zahlen ausschließen ist dann \D) und es muß mindestens eine oderer mehrere Zahlen sein, also brauchen wir das Zeichen +. Der Ausdruck wäre dann ja (\d+) und dieser muß sich zwischen den beiden Tags und befinden. Da keine Bedeutung bei regulären Ausdrücken hat, brauchen wir sie nicht mit einem \ versehen. Da die Tags nicht nur am Zeilenanfang oder Ende bzw. alkleine in einer Zeile stehen, brauchen wir auch nicht die Zeichen ^ (Zeilenanfang) und $ (Zeilenende) verwenden. Somit sieht der Ausdruck schon mal so aus: (\d+) Nun muß der reguläre Ausdruck ja noch "eingerahmt" werden, da aber das Zeichen / gesucht wird, wäre es nicht sonderlich klug dieses zu verwenden, oder du müßtest das Zeichen im Suchbegriff mit einem Backslash versehen, damit es zum Suchbegriff mitzählt. (Beispiel: \/) Da man aber auch andere Zeichen nehmen kann, die nicht im Suchbegriff benutzt werden, würde ich das Zeichen # benutzen. Somit sieht der fertige Begriff so aus: #(\d+)# Nun kann man bei preg_match noch einen dritten Parameter angeben, was ein Array mit den gefundenen Stellen ist. Aber genug geredet, nun das praktische Beispiel. Hab es mal ein wenig kommentiert und sollte als Erklärung ausreichen, ansonsten schrei einfach wieder laut: <?php // Einbinden der Snoopy Klasse require ("Snoopy.class.inc"); // Erstellen einer neuen Instanz (hier $snoopy) der Klasse $snoopy = new Snoopy; // Holen der Informationen von der entsprechenden Seite $snoopy->fetch ("http://www.google.com/search?client=navclient-auto&ch=51123608106&q=info:http%3A%2F%2Fwww%2Et-online%2Ede%2F"); // Speichern des geholten Informationen in eine seperate Variable // (Man kann auch direkt mit $snoopy->results arbeiten, aber zur Verdeutlichung // mal den Umweg über eine andere Variable) $informationen = $snoopy->results; // Suchen nach der gewünschten Informationen und falls etwas gefunden // wurde, den ersten Treffer anzeigen if (preg_match("#<RK>(\d+)</RK>#", $informationen, $treffer)) { echo "Treffer: ".$treffer[0]; } else { echo "Bin entweder blind oder es ist nichts enthalten;)"; } ?> Hoffe, das hilft. :) Share this post Link to post
Anderl72 0 Report post Posted January 31, 2004 Ich glaub ich habs kappiert !!! Danke Stefan, du bist echt spitze !!! wünsche schönes Wochenende Share this post Link to post
Anderl72 0 Report post Posted February 1, 2004 irgendwie klappt es immer noch nicht so wie ich es mir vorstelle. Nun bekomme ich folgenden Fehler: Warning: main(Snoopy.class.inc): failed to open stream: No such file or directory in C:\Apache\htdocs\tst.php on line 6 Fatal error: main(): Failed opening required 'Snoopy.class.inc' (include_path='c:\php\includes') in C:\Apache\htdocs\tst.php on line 6 Die Snoopy Klasse habe ich in das Verzeichnis c:\php\includes kopiert. Trotzdem kann sie nicht gefunden werden Ich habe gestern und heute lange nach der Ursache gesucht, aber nichts gefunden Ich bin zum Entschluss gekommen, dass mein lokaler Webserver nicht richtig konfiguriert ist. Aber was ist falsch??? Die Pfade zur Php.ini werden richtig gelesen: Das root verzeichnis, das extention verzeichnis und der Include Pfad werden auch richtig gelesen: Das Server Root Verzeicnis ist da wo die logs liegen: Das Root verzeichnis der Dokumente stimmt auch: Mir ist nichts ungewöhnliches aufgefallen. Euch vielleicht ???? Was jedoch eigenartig ist, ich komme auf den lokalen server erst, nach dem ich eine verbindung ins internet habe. Das dürfte ja nicht sein. Oder doch? schönen Sonntag noch wünscht Anderl Habt ihr Share this post Link to post
Stefan 0 Report post Posted February 1, 2004 Hast du mal die Datei mit der Snoopy Klasse ins gleiche Verzeichnis gelegt, wo auch deine eigentliche PHP Datei ist? Dann einfach nur folgende Zeile require ("Snoopy.class.inc"); verwenden. Man kann sich aber auch das Leben schwer machen. :lol: Share this post Link to post
Anderl72 0 Report post Posted February 2, 2004 ohhhh .............. nun habe ich den fehler gefunden. die klasse im Archiv hat den namen "Snoopy.class.php" und im Code "Snoopy.class.inc" ..... Das kann ja nicht funktionieren Und ich schraub mein halbes System auseinander Ich bedanke und verbeuge mich vor dir Stefan greetz Anderl Share this post Link to post
Stefan 0 Report post Posted February 2, 2004 Ja, in meinem Beispielcode steht Snoopy.class.inc, weil in der Version, die ich habe, die Datei noch so heißt. Nun gut, jetzt klappt es ja und du kennst dich wahrscheinlich jetzt noch ein wenig besser in deinem System aus. :lol: Share this post Link to post
Anderl72 0 Report post Posted February 2, 2004 läuft wie ein schnürrchen Vielen Dank nochmal Share this post Link to post