phpbar.de logo

Mailinglisten-Archive

AW: [php] sax parser und entities innerhalb von attributwerten

AW: [php] sax parser und entities innerhalb von attributwerten

Thomas Richter php at wwedit.org
Fre Jul 23 20:32:50 CEST 2004


> wo hast Du die Entities definiert? Wenn Du eine externe DTD 
> verwendest, 
> könnte es sein, dass das gar nicht geht.
> Meine eigene Parserklasse - XML-Line- sollte die Entities richtig 
> einsetzten, sobald die DTD innerhalb des XML-Dokuments erfolgt.
> Eigentlich sollte das mit der PEAR-Klasse ebenfalls gehen, 
> wenn Du die 
> Ausgabe der entsprechenden Handler in einem Buffer speicherst 
> und diesen 
> hinterher ausgibst.

ok.. sag ich es mal anders:

class parser extends XML_Parser
{
  var $cdata_stack = array();

  function parser($xml)
  {
	$this->folding = false;
	parent::XML_Parser();
	$r = $this->parseString($xml)
	if (PEAR::isError($r)) die("parsing failed: ".$r->toString());
  }
  function startHandler($xp,$tag,$attr)
  {
	$this->cdata_stack[] = "";
  }

  function endHandler($xp,$tag)
  {
	$data = array_pop($this->cdata_stack);
  }

  function cDataHandler($xp,$data)
  {
      $this->cdata[count($this->cdata)-1] .= $data;
  }

  function defaultHandler($xp,$data)
  {
	$this->cDataHandler($xp,$data);
  }
}

das xml dokument ist ein xhtml dokument und komplett valide (html und
xml valide!).

nun habe ich folgendes:

<!DOCTYPE html ...>
<?xml version="1.0" ?>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <img src="xxx" title="sch&ouml;ner text" />
  </body>
</html>

das eigentlich parsen ist kein problem... 

das img tag enthaelt ein title attribut. dieses attribut enthaelt ein
entity &ouml;.

im startHandler() bekomme ich dann fuer das img tag folgendes:

$tag == 'img'
$attr['src'] == 'xxx'
$attr['title'] == 'schner text'

...

der defaultHandler() bekommt auf jeden fall VOR/NACH (nicht genau
geprueft) dem aufruf von startHandler() das &ouml; in $data.

damit sind die informationen komplett zerstoert... :(


gruss

thomas



php::bar PHP Wiki   -   Listenarchive