Ukázka využití XMLReaderu a doplnění chybějící funkčnosti

Příklad 23. prehled/xmlreader.php

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN'>
<html lang="cs">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>Přehled zpráv</title>
  </head>
  <body>
<?php 

// vytvoření nového XMLReaderu
$reader = new XMLReader2();

// otevření souboru pro čtení
$reader->open("../data/luparss.xml");

// dokud je co, čteme další část dokumentu XML
while ($reader->read())
{
  // obsluha odkazu (element link)
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "link")
    echo "<h1>Přehled aktuálních zpráv ze serveru 
      <a href='" . htmlspecialchars($reader->readString(), ENT_QUOTES) . "'>" .
      $title . "</a></h1>";

  // obsluha názvu kanálu
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "title")
    $title = htmlspecialchars($reader->readString());

  // obsluha položky v kanálu
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "item")
  {
    echo "<dl>";

    // dokud je co, čteme další část dokumentu XML 
    // předpokládáme přitom, že elementy jsou uvnitř elementu item
    while ($reader->read())
    {
      if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "link")
				echo "<dt><a href='" . htmlspecialchars($reader->readString(), ENT_QUOTES) . "'>" .
					$title . "</a></dt>\n";

      if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "title")
				$title = htmlspecialchars($reader->readString());

      if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "description")
				echo "<dd>" .  htmlspecialchars($reader->readString()) . "</dd>\n";
    }

    echo "</dl>";
  }
}

class XMLReader2 extends XMLReader
{
  function readString()
  {
		$depth = 1;
		$text = "";

		while ($this->read() && $depth != 0)
		{
			if (in_array($this->nodeType, array(XMLReader::TEXT, XMLReader::CDATA, XMLReader::WHITESPACE, XMLReader::SIGNIFICANT_WHITESPACE)))
				$text .= $this->value;
			if ($this->nodeType == XMLReader::ELEMENT) $depth++;
			if ($this->nodeType == XMLReader::END_ELEMENT) $depth--;
		}
		return $text;
	}
}

?>
  </body>
</html>