xml über php in html parsen

Flipper

Aktives Mitglied
Hallo liebe php´ler,

ich möchte auf der Detailseite meines RSS- Verzeichnisses die Links des RSS- Feeds auslesen. Es ist mir mit folgendem Parser gelungen:

CODE <?

// the recording-constants - need to start with a value > 0 !
define ("RSS_CHANNEL", "1");
define ("RSS_IMAGE", "2");
define ("RSS_ITEM", "3");

class RSSParser {

// parser dependant variables
var $objParser;
var $intOnRecording;
var $strLastParsingError;
var $strLastData;

// data dependent variables
var $arrRSSChannel;
var $arrRSSItems;
var $inxRSSItems;



// class constructor
function RSSParser() {

$this->strLastParsingError = array();
$this->arrRSSChannel = array();
$this->arrRSSItems = array();
$this->inxRSSItems = 0;
$this->strLastData = "";
$this->intOnRecording = 0;
$this->objParser = xml_parser_create();

// set the default handlers
xml_set_object($this->objParser, $this);
xml_set_element_handler($this->objParser, "openTag", "closeTag");
xml_set_character_data_handler($this->objParser, "data");

} // constructor



function runRSSParsingProcess ($strXMLCode) {

// parse the given XML-Code
xml_parse($this->objParser, $strXMLCode);

} // runRSSParsingProcess


// parser dependent methods
// ==================================================================

function openTag($parser, $tag, $attr) {

switch ($tag) {

// set the recording flag
case "CHANNEL": $this->intOnRecording = RSS_CHANNEL; break;
case "IMAGE": $this->intOnRecording = RSS_IMAGE; break;
case "ITEM": $this->intOnRecording = RSS_ITEM; break;

} // switch

// handle attributes of tags
switch ($tag) {
case "RSS":
$this->arrRSSChannel["version"] = $attr["VERSION"]; break;
} // switch

} // function openTag(..)




function closeTag($parser, $tag) {

if ($this->intOnRecording == RSS_CHANNEL) {

switch ($tag) {
case "TITLE": $this->arrRSSChannel["title"] = $this->strLastData; break;
case "LINK": $this->arrRSSChannel["link"] = $this->strLastData; break;
case "DESCRIPTION": $this->arrRSSChannel["description"] = $this->strLastData; break;
} // switch

} else if ($this->intOnRecording == RSS_IMAGE) {

switch ($tag) {
case "TITLE": $this->arrRSSChannel["imageTitle"] = $this->strLastData; break;
case "URL": $this->arrRSSChannel["imageURL" ] = $this->strLastData; break;
case "LINK": $this->arrRSSChannel["imageLink" ] = $this->strLastData; break;
} // switch

} else if ($this->intOnRecording == RSS_ITEM) {

switch ($tag) {
case "ITEM": $this->inxRSSItems++; break;
case "TITLE": $this->arrRSSItems[$this->inxRSSItems]["title"] = $this->strLastData; break;
case "LINK": $this->arrRSSItems[$this->inxRSSItems]["link"] = $this->strLastData; break;
} // switch

} // if..else (onRecording)

$this->strLastData = "";

} // function closeTag(..)



function data($parser, $data) {

if ($this->intOnRecording != 0) {
$this->strLastData .= trim($data);
} // if

} // function data(..)




// get methods
// ==================================================================

function getRSSChannel() {
return $this->arrRSSChannel;
} // getRSSChannel()

function getRSSItems() {
return $this->arrRSSItems;
} // getRSSItems()


} // class rssParser

?>


Folgenden Code habe ich in die entsprechende Datei eingebunden:


CODE <?php
// include the parser class
require_once ("RSSParser.class.php");

$rssParser = new RSSParser();

$rssSource = sefReltoAbs('index.php?option=com_linkdirectory&task=detail&id='.$link->id.'&Itemid='.$this->row->url);

$rssFile = implode("",file($rssSource));

#echo "RSS-Quelle: ".$rssSource;

// start the parsing process
$rssParser->runRSSParsingProcess ($rssFile);

// get the arrays and print the information
$channelInfo = $rssParser->getRSSChannel();
$rssItems = $rssParser->getRSSItems();

if (isset ($channelInfo["version"]) ) {
echo "<br>RSS-Version: ".$channelInfo["version"];
} // if
echo "<br>";
if ( isset($channelInfo["imageURL"]) && $channelInfo["imageURL"] != "" ) {
echo "<a href=\"".$channelInfo["imageLink"]."\">";
echo "<img src=\"".$channelInfo["imageURL"]."\" ";
echo "title=\"".$channelInfo["imageTitle"]."\"";
echo "/>";
echo "</a>";
} // if
echo "<br>Titel: <b>".utf8_decode($channelInfo["title"])."</b>";
echo "<br>Beschreibung: <b>".utf8_decode($channelInfo["description"])."</b>";
echo "<br>Beiträge: <b>".count($rssItems)."</b>";

$i = 20;
foreach ($rssItems as $item) {
if (--$i < 0)
break;
echo "<br><h3>";
echo "<a href=\"".$item["link"]."\">";
echo "<span class=\"rssItem\">";
echo $item["title"];
echo "</span>";
echo "</a>";
} // foreach


?>


Nun mein Anliegen:

Ich möchte nicht nur den Titel und den Link auslesen, sondern auch die Description zu jedem einzelnen Item untereinander anzeigen lassen.

Für Tips bin ich sehr dankbar :)

Gruss
 
Wenn dir dieser Parser wirklich selbst "gelungen" ist - dann könntest du dir die Frage spielend selbst beantworten
wink.gif
 
Hallo Alonso,

den Parser habe ich selbstverständlich nicht selbst erstellt und da ich keine Ahnung habe, poste ich hier
rolleyes.gif
 
Sorry, falsch interpretiert..

So grob überflogen müsste folgendes klappen:
CODE
..

foreach ($rssItems as $item) {
 if (--$i < 0)
   break;
 echo "<br><h3>";
 echo "<a href=\"".$item["link"]."\">";
 echo "<span class=\"rssItem\">";
 echo $item["title"];
 echo "</span>";
 echo "</a>";
 echo "<span class=\"rssDescription\">".$item["description"]."</span>";
} // foreach

..


 
Hab´s schnell mal getestet --> funktioniert leider nicht...

trotzdem vielen Dank!!
 
Okay, das wird noch nicht geparst.

Versuche mal das da (zusätzlich):
CODE
<?

// the recording-constants - need to start with a value > 0 !
define ("RSS_CHANNEL",          "1");
define ("RSS_IMAGE",            "2");
define ("RSS_ITEM",             "3");

class RSSParser {

// parser dependant variables
var $objParser;
var $intOnRecording;
var $strLastParsingError;
var $strLastData;

// data dependent variables
var $arrRSSChannel;
var $arrRSSItems;
var $inxRSSItems;



// class constructor
function RSSParser() {

  $this->strLastParsingError  = array();
  $this->arrRSSChannel        = array();
  $this->arrRSSItems          = array();
  $this->inxRSSItems          = 0;
  $this->strLastData          = "";
  $this->intOnRecording       = 0;
  $this->objParser            = xml_parser_create();

  // set the default handlers
  xml_set_object($this->objParser, $this);
  xml_set_element_handler($this->objParser, "openTag", "closeTag");
  xml_set_character_data_handler($this->objParser, "data");

} // constructor



function runRSSParsingProcess ($strXMLCode) {

  // parse the given XML-Code
  xml_parse($this->objParser, $strXMLCode);

} // runRSSParsingProcess


// parser dependent methods
// ==================================================================

function openTag($parser, $tag, $attr) {

  switch ($tag) {

    // set the recording flag
    case "CHANNEL":   $this->intOnRecording = RSS_CHANNEL;  break;
    case "IMAGE":     $this->intOnRecording = RSS_IMAGE;    break;
    case "ITEM":      $this->intOnRecording = RSS_ITEM;     break;

  } // switch

  // handle attributes of tags
  switch ($tag) {
    case "RSS":
      $this->arrRSSChannel["version"] = $attr["VERSION"]; break;
  }  // switch

} // function openTag(..)




function closeTag($parser, $tag) {

  if ($this->intOnRecording == RSS_CHANNEL) {

    switch ($tag) {
      case "TITLE":         $this->arrRSSChannel["title"]       = $this->strLastData;   break;
      case "LINK":          $this->arrRSSChannel["link"]        = $this->strLastData;   break;
      case "DESCRIPTION":   $this->arrRSSChannel["description"] = $this->strLastData;   break;
    } // switch

  } else if ($this->intOnRecording == RSS_IMAGE) {

    switch ($tag) {
      case "TITLE":         $this->arrRSSChannel["imageTitle"]  = $this->strLastData;   break;
      case "URL":           $this->arrRSSChannel["imageURL" ]   = $this->strLastData;   break;
      case "LINK":          $this->arrRSSChannel["imageLink" ]  = $this->strLastData;   break;
    } // switch

  } else if ($this->intOnRecording == RSS_ITEM) {

    switch ($tag) {
      case "ITEM":          $this->inxRSSItems++;                                                   break;
      case "TITLE":         $this->arrRSSItems[$this->inxRSSItems]["title"] = $this->strLastData;   break;
      case "LINK":          $this->arrRSSItems[$this->inxRSSItems]["link"] = $this->strLastData;    break;
      case "DESCRIPTION":   $this->arrRSSItems[$this->inxRSSItems]["description"] = $this->strLastData;    break;
    } // switch

  } // if..else (onRecording)

  $this->strLastData = "";

} // function closeTag(..)



function data($parser, $data) {

  if ($this->intOnRecording != 0) {
    $this->strLastData .= trim($data);
  } // if

} // function data(..)




// get methods
// ==================================================================

function getRSSChannel() {
  return $this->arrRSSChannel;
} // getRSSChannel()

function getRSSItems() {
  return $this->arrRSSItems;
} // getRSSItems()


} // class rssParser

?>



(Ungetestet)

Sollte dies klappen, wirst du als nächstes mit hoher Sicherheit Probleme mit den Umlauten haben..
 
Vielen Dank Alonso! Das funktioniert.

Das mit den Umlauten habe ich so gelöst:

CODE foreach ($rssItems as $item) {
if (--$i < 0)
break;
echo "<br><h3>";
echo "<a href=\"".$item["link"]."\">";
echo "<span class=\"rssItem\">";
echo $item["title"];
echo "</span>";
echo "</a>";
echo "<span class=\"rssDescription\">";
echo "<br>Beschreibung: <b>".utf8_decode($item["description"])."</b>";
echo "</span>";
} // foreach


Nochmals vielen Dank!!!

Gruß
 
Zurück
Oben