XML_Parser code

[email protected] ("Alex Rozhik")
Newsgroups php.pear
Message-ID <01b301c09c13$3e687a40$06050a0a@ntsrv>
When i try tu use XML_Parser i found some inconvenient.
Because calback functions working as static function. (I cant use $this in
it ).
I'd like to do this function as class member.
This is modified code of XML/Parser.php (see attachment)

Callback functions of new class can be used like this.
class XML_FactoryImport extends XML_NParser {
    var $root;
    function XML_FactoryImport( &$root, $charset='UTF-8' ) {
 $this->XML_NParser( $charset );
 $this->root=$root;
    }
    function startHandler( $p, $name, $attr) {
 $this->root = $this->root->MakeChild( $name, $attr );
    }
    function endHandler( $p, $name ) {
 $this->root = $this->root->GetParent();
    }
    function cdataHandler( $p, $data ) {
 $this->root->SetText( $this->root->GetText().$data );
    }
};
NParser.php (application/octet-stream, 3.5 KB)
<?php

require_once "PEAR.php";
require_once "XML/Parser.php";
require_once "Net/Socket.php";

class XML_NParser extends PEAR {
    function XML_NParser($charset = 'UTF-8') {
	global $_XML_NParser;
	$this->PEAR();
	$xp = @xml_parser_create($charset);
	if (is_resource($xp)) {
	    $this->parser = $xp;
	    $_XML_NParser[$xp]=&$this;
	    xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING,1);
	    xml_set_object($xp, $this);
	    xml_set_element_handler($xp, "IstartHandler", "IendHandler");
	    xml_set_character_data_handler($xp, "IcdataHandler");
	    xml_set_default_handler($xp, "IdefaultHandler");
	    xml_set_processing_instruction_handler($xp, "IpiHandler");
	    xml_set_unparsed_entity_decl_handler($xp, "IunparsedHandler");
	    xml_set_notation_decl_handler($xp, "InotationHandler");
	    xml_set_external_entity_ref_handler($xp, "IentityrefHandler");
	}
    }
    function	IstartHandler( $p, $name, $attrib ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->startHandler( $p, $name, $attrib );
    }
    function	IendHandler( $p, $name) {
	global $_XML_NParser;
	$_XML_NParser[$p]->endHandler( $p, $name);
    }
    function	IstartHandler( $p, $name, $attrib ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->startHandler( $p, $name, $attrib );
    }
    function	IcdataHandler( $p, $data ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->cdataHandler( $p, $data );
    }
    function	IdefaultHandler( $p, $data ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->defaultHandler( $p, $data );
    }
    function	IpiHandler( $p, $target, $data ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->piHandler( $p, $target, $data );
    }
/*    
    function	IunparsedHandler( $p, $name, $attrib ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->unparsedHandler( $p, $name, $attrib );
    }
*/    
    function	IentityHandler( $p, $openEntityNames, $base, $systemId,  $publicId ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->entityHandler( $p, $openEntityNames, $base, $systemId,  $publicId );
    }
    
    
    function	startHandler( $p, $name, $attrib ) {
    }
    function	endHandler( $p, $name) {
    }
    function	startHandler( $p, $name, $attrib ) {
    }
    function	cdataHandler( $p, $data ) {
    }
    function	defaultHandler( $p, $data ) {
    }
    function	piHandler( $p, $target, $data ) {
    }
/*    
    function	unparsedHandler( $p, $name, $attrib ) {
    }
*/    
    function	entityHandler( $p, $openEntityNames, $base, $systemId,  $publicId ) {
    }
    function setInputFile($file) {
	$fp = fopen($file, "r");
	if (is_resource($fp)) {
	    $this->fp = $fp;
	    return $fp;
	}
	return new XML_Parser_Error($php_errormsg);
    }

    function setInput($fp) {
	if (is_resource($fp)) {
	    $this->fp = $fp;
	    return true;
	}
	return new XML_Parser_Error("not a file resource");
    }

    function parse() {
	if (!is_resource($this->fp)) {
	    return new XML_Parser_Error("no input");
	}
	if (!is_resource($this->parser)) {
	    return new XML_Parser_Error("no parser");
	}
	while ($data = fread($this->fp, 2048)) {
	    $err = $this->parseString($data, feof($this->fp));
	    if (PEAR::isError($err)) {
		return $err;
	    }
	}
	return true;
    }

    function parseString($data, $eof = false) {
	if (!is_resource($this->parser)) {
	    return new XML_Parser_Error("no parser");
	}
	if (!xml_parse($this->parser, $data, $eof)) {
	    $err = new XML_Parser_Error($this->parser);
	    xml_parser_free($this->parser);
	    return $err;
	}
	return true;
    }

    function readSocket( &$socked ) {
	while( $line=$socked->ReadLine() ) {
	    $this->parseString( $line );
	}
    }
}


?>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.