Matze: X(HT)ML Document mit PHP verarbeiten

Hallo und guten Abend!

Ich hatte heut das Problem, dass ich ein Dokument von einer anderen Domain einlesen wollte. Mit curl konnte ich das Problem lösen und kann nun mein Dokument von einer Domain aus betrachten.

Ich bräuchte allerdings nur einen Ausschnitt des Dokuments. Genauer, nur den Teil mit einer bestimmten Klasse und dessen Kindelemente.

Gibt es eine PHP Funktion mit der ich die Elemente des XML-Baums anhand der Klasse extrahieren und in ein Array bekommen kann?

Danke und Grüße, Matze

  1. Hi,

    Gibt es eine PHP Funktion mit der ich die Elemente des XML-Baums anhand der Klasse extrahieren und in ein Array bekommen kann?

    für XML schon, für (X)HTML wird es schwieriger.

    XML

    Lesenswert : http://de.php.net/simplexml

    Insbsondere: http://de.php.net/manual/de/function.simplexml-load-file.php

    Dann hast du ein Object, dass du gezielt ansprechen kannst. Nun gibt es meherere Möglichkeiten das gewünschte zu extrahieren, hängt aber davon ab wie der Aufbau des XML-Dokumentes ist. Entweder direkt ansprechbar oder Regex oder in einer Schleife durchlaufen lassen um es mit Stringfunktionen zu finden.

    Mike

    1. Hallo!

      für XML schon, für (X)HTML wird es schwieriger.

      Ist XHTML denn kein gültiges XML-Document?

      Mh wenn ich mir das so überlege müsste es doch so klappen oder:

        
      $xmlstr = <<<XML  
      // meine X-HTML Datei  
      XML;  
      $xml = new SimpleXMLElement($xmlstr);  
      
      

      Anschließend könnte ich mit einer Schleife die Elemente mit der gewünschten Klasse und deren Kindelemente auslesen oder? Brauch ich dazu wirklich eine Stringfunktion? Ich dachte an eine Schleife mit einer einfach if-Abfrage.
      if(Klasse=="foobar") Treffer! -> Element mit Kindelementen in Array speichern.

      Ich weiß zwar noch nicht wie, aber so hab ich mir das etwa vorgestellt.

      Danke und Grüße, Matze

  2. Hallo!

    Also ich habe jetzt Folgendes versucht:

    Zunächst die Abfrage der Datei von der zweiten Domain mit den curl-Funktionen.

      
     // neuen curl-Handler erzeugen $ch  
     $ch = curl_init();  
      
     // setze die URL - htaccess geschütztes Verzeichnis  
     curl_setopt($ch, CURLOPT_URL, "http://www.domain.tld/admin/index.php");  
      
     // Authentifizierung senden  
     $user = "username";  
     $pwd = "password";  
     curl_setopt($ch, CURLOPT_HTTPAUTH, 'CURLAUTH_ANY');  
     curl_setopt($ch, CURLOPT_USERPWD, "$user:$pwd");  
      
     // Daten als String senden, nicht ausgeben  
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
      
     // Daten als String an $content übergeben  
     $content = curl_exec($ch);  
      
     // curl-Handler schließen  
     curl_close($ch);  
    
    

    Der Inhalt der Datei von der zweiten Domain steht jetzt also in $content.
    So weit so gut.

    Jetzt der erste Versuch das Ganze zu verarbeiten.

      
    // sollte mir ein SimpleXMLElement geben  
    $xml = simplexml_load_file($content);  
    print_r($xml);  
      
    // stattdessen  
    /* simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name... */  
      
    // einen Fehler mit einem Auszug der ersten Zeilen des Quelltextes (Inhalt von $content)  
    
    

    Jetzt der zweite Versuch:

      
    // sollte mir auch ein SimpleXMLElement geben  
    $xml = simplexml_load_string($content);  
    print_r($xml);  
      
    // stattdessen Fehler bei kodierten Umlauten (ich denk wegen dem &-Zeichen) z.B.  
    /* Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 6: parser error : Entity 'uuml' not defined in... */  
    
    

    Jetzt der dritte und bisher letzte Versuch:

      
    // zerstört mir erwartungsgemäß auch Zeichen die ich für XML benötige  
    $xml = simplexml_load_string(htmlpecialchars($content));  
    print_r($xml);  
      
    // ergibt  
    /* simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Start tag expected, '<' not found in... */  
    
    

    Gut, das letzte Ergebnis hatte ich erwartet, aber ich komm einfach nicht drauf was ich falsch mache. Ich glaube bin schon auf einem ganz guten Weg, scheitere aber auf der Zielgeraden.

    Könnte mich vielleicht jemand anstossen und mir einen Tipp geben wo mein Denkfehler liegt?

    Danke und Grüße, Matze