Jump to content
InvisionCommunity.de - Der Deutsche Invision Community Support
Sign in to follow this  
Anderl72

XML Seite in Datenbank aufnehmen

Recommended Posts

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

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

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 :D Danke für den hint !!!

Share this post


Link to post

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 :P ich lese nochmal weiter :D

Share this post


Link to post

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

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:&lt;br&gt; deutsch weltweit Produkte Profisuche Hilfe. &lt;b&gt;...&lt;/b&gt;  </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

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

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:

1.jpg

Das root verzeichnis, das extention verzeichnis und der Include Pfad werden auch richtig gelesen:

2.jpg

Das Server Root Verzeicnis ist da wo die logs liegen:

3.jpg

Das Root verzeichnis der Dokumente stimmt auch:

4.jpg

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

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

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 :D Und ich schraub mein halbes System auseinander :D

Ich bedanke und verbeuge mich vor dir Stefan :D

greetz

Anderl

Share this post


Link to post

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×