Re: Expat Wrapper and SAX Filters

From: Date: Wed, 10 Apr 2002 10:56:09 +0000
Subject: Re: Expat Wrapper and SAX Filters
References: 1  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-5294@lists.php.net to get a copy of this message
Unless someone beats me to it, I'll implement a listener interface in the next XML_Parser release. - Stig On Tue, 2002-04-09 at 19:14, Luis Argerich wrote: > After taking a look at your Parser class wrapping the Expat parser I wanted > to share and idea with you. > > IMHO the SAX wrapper class should allow the user to set a "listener" object, > an object where SAX events are passed, > the SAX wrapper should implement all the SAX handlers and only do a > $this->listener->nameOfHandler(params) inside. > This way we can program SAX filters that receive SAX events and produce more > SAX events or some result, chaining > filters allow to build complex SAX transformations/modifications or other > operations over XML documents. > > For example take a look at this abstract classes: > > class AbstractSAXParser { > var $listener; > function AbstractSAXParser() {} > function parserSetoption($opt,$val) {} > function setListener($obj) { > $this->listener=$obj; > } > function startElementHandler($parser,$name,$attribs) { > $this->listener->startElementHandler($name,$attribs); > } > function endElementHandler($parser,$name) { > $this->listener->endElementHandler($name); > } > function characterDataHandler($parser,$data) { > $this->listener->characterDataHandler($data); > } > function parse() {} > } > > class AbstractFilter { > var $listener; > > function setListener($obj) { > $this->listener=$obj; > } > function startElementHandler($name,$attribs) {} > function endElementHandler($name) {} > function characterDataHandler($data) {} > > } > > The abstract SAX parser wraps a SAX parser, we can make a derivative class > for Expat or we can also derivate the AbstractClass to a class > that parses non-xml data generating SAX events and thus allowing to convert > non-xml data to XML. > > The Filter is the class that receives SAX events and in the handlers perform > some operations and may propagate the events to a next listener, > a final Filter that outputs XML for example just intercepts the events but > don't propagate them. > > Example: > > $parser=new ExpatParser($xmlfilename); // ExpatParser extends > AbstractSAXPaser > $filter=new Filter(); // Some filter > $parser->setListener($filter); > $parser->parse(); > We can for example chain filters to transform a document using several minor > "modular" transformations or modify a document using a filter > that adds or remove elements (several elements can be added or removed if we > queue the modifications in the filter before parsing) > This leads to several advantages since complex transformations/modifications > can be performed reading the XML file just once and at > SAX speed and cosuming very few resources. Results can also be streammed > since SAX allows streaming the result as it is generated. > > I believe that PEAR is the place where the "standard" AbstractSAXParser and > Filter classes can be defined standarizing the way to > write SAX filters with PHP. > > Let me know what you think about this. > > > > > > -- > PEAR Development Mailing List (http://pear.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php

« previous php.pear.dev (#5294) next »