From: Arne Heizmann Date: Sat, 18 Sep 2004 14:43:19 +0000 (+0000) Subject: This didn't seem to work because of some sort of change to PHP's handling of X-Git-Tag: 1.5.0alpha1~1965 X-Git-Url: http://git.cyclocoop.org/%24self?a=commitdiff_plain;h=bfd7fecc0599685c0f880cacb5c535c0bcb9ae27;p=lhc%2Fweb%2Fwiklou.git This didn't seem to work because of some sort of change to PHP's handling of references to objects or something. I fixed it by adding elements to their parent when they are closed, not when they are opened. Also fixed indentation and stuff like that. myPrint() now returns string instead of just printing everything. --- diff --git a/includes/ParserXML.php b/includes/ParserXML.php index 5b08a2bc10..e2f1770b55 100644 --- a/includes/ParserXML.php +++ b/includes/ParserXML.php @@ -10,67 +10,63 @@ * @package MediaWiki */ class element { - var $name = ''; - var $attrs = array(); - var $children = array(); - - function myPrint() { - echo ''; - } + var $name = ''; + var $attrs = array(); + var $children = array(); + function myPrint() { + $ret = "\n"; + return $ret; + } } $ancStack = array(); // the stack with ancestral elements // Three global functions needed for parsing, sorry guys function wgXMLstartElement($parser, $name, $attrs) { - global $ancStack, $rootElem; - - $newElem = new element; - $newElem->name = $name; - $newElem->attrs = $attrs; - array_push($ancStack, $newElem); - // add to parent if parent exists - $nrAncs = count($ancStack)-1; - if ( $nrAncs > 0 ) { - array_push($ancStack[$nrAncs-1]->children, &$ancStack[$nrAncs]); - } else { - // make extra copy of root element and alias it with the original - array_push($ancStack, &$ancStack[0]); - } + global $ancStack; + + $newElem = new element; + $newElem->name = $name; + $newElem->attrs = $attrs; + + array_push($ancStack, $newElem); } function wgXMLendElement($parser, $name) { - global $ancStack, $rootElem; - - // pop element of stack - array_pop($ancStack); + global $ancStack, $rootElem; + // pop element off stack + $elem = array_pop ($ancStack); + if (count ($ancStack) == 0) + $rootElem = $elem; + else + // add it to its parent + array_push ($ancStack[count($ancStack)-1]->children, $elem); } function wgXMLcharacterData($parser, $data) { - global $ancStack, $rootElem; - - $data = trim ( $data ) ; // Don't add blank lines, they're no use... - - // add to parent if parent exists - if ( $ancStack && $data != "" ) { - array_push($ancStack[count($ancStack)-1]->children, $data); - } + global $ancStack; + $data = trim ($data); // Don't add blank lines, they're no use... + // add to parent if parent exists + if ( $ancStack && $data != "" ) { + array_push ($ancStack[count($ancStack)-1]->children, $data); + } } @@ -81,36 +77,56 @@ function wgXMLcharacterData($parser, $data) { */ class xml2php { - function &scanFile( $filename ) { - global $ancStack; - $ancStack = array(); - - $xml_parser = xml_parser_create(); - xml_set_element_handler($xml_parser, 'wgXMLstartElement', 'wgXMLendElement'); - xml_set_character_data_handler($xml_parser, 'wgXMLcharacterData'); - if (!($fp = fopen($filename, 'r'))) { - die('could not open XML input'); - } - while ($data = fread($fp, 4096)) { - if (!xml_parse($xml_parser, $data, feof($fp))) { - die(sprintf("XML error: %s at line %d", - xml_error_string(xml_get_error_code($xml_parser)), - xml_get_current_line_number($xml_parser))); - } - } - xml_parser_free($xml_parser); - - // return the remaining root element we copied in the beginning - return $ancStack[0]; - } - + function &scanFile( $filename ) { + global $ancStack, $rootElem; + $ancStack = array(); + + $xml_parser = xml_parser_create(); + xml_set_element_handler ($xml_parser, 'wgXMLstartElement', 'wgXMLendElement'); + xml_set_character_data_handler ($xml_parser, 'wgXMLcharacterData'); + if (!($fp = fopen($filename, 'r'))) { + die('could not open XML input'); + } + while ($data = fread($fp, 4096)) { + if (!xml_parse($xml_parser, $data, feof($fp))) { + die(sprintf("XML error: %s at line %d", + xml_error_string(xml_get_error_code($xml_parser)), + xml_get_current_line_number($xml_parser))); + } + } + xml_parser_free($xml_parser); + + // return the remaining root element we copied in the beginning + return $rootElem; + } + + function scanString ( $input ) { + global $ancStack, $rootElem; + $ancStack = array(); + + $xml_parser = xml_parser_create(); + xml_set_element_handler ($xml_parser, 'wgXMLstartElement', 'wgXMLendElement'); + xml_set_character_data_handler ($xml_parser, 'wgXMLcharacterData'); + + if (!xml_parse ($xml_parser, $input, true)) { + die (sprintf ("XML error: %s at line %d", + xml_error_string(xml_get_error_code($xml_parser)), + xml_get_current_line_number($xml_parser))); + } + xml_parser_free ($xml_parser); + + // return the remaining root element we copied in the beginning + return $rootElem; + } + } -$w = new xml2php; -$filename = 'sample.xml'; -$result = $w->scanFile( $filename ); -$result->myPrint(); +/* Example code: -return 0; + $w = new xml2php; + $filename = 'sample.xml'; + $result = $w->scanFile( $filename ); + print $result->myPrint(); +*/ ?>