Using a stream filter to do a search and replace on an XML file.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello.

Just learning about stream filtering and have 2 questions I hope
someone can give me some pointers on.


1 - Bucketing.

In reading a bit about how this works, the data is passed in chunks
through the filter - known as a bucket brigade.

How does this work if, for example, the search string is chopped by
the bucketing system? It would seem that you would end up with 2 parts
of the search element, neither would be matched for replacing and then
the whole element would be reconstituted in the output.

My filter method is ...

	function filter($r_In, $r_Out, &$i_Consumed, $b_Closing)
		{
		while ($o_Bucket = stream_bucket_make_writeable($r_In))
			{
			$o_Bucket->data = preg_replace('`<(/?)(\d+)`', '<$1fixed_$2',
$o_Bucket->data);
			$i_Consumed += $o_Bucket->datalen;
			stream_bucket_append($r_Out, $o_Bucket);
			}

		return PSFS_PASS_ON;
		}

This is working fine (so far as I can tell as SimpleXMLIterator is now
happy to read the XML file), but I'm guessing I'm missing something
here if my understanding is correct.




2 - Stream wrapping.

At the moment, we download a .gz file and decompress it into the .xml
file. I know I can use a zlib:// stream wrapper to save me having to
decode the .gz file first. This means smaller downloads and less
storage. We can even use the zlib:// filter on the URL, but we cache
the .gz file locally, so that isn't important.

But for a small set of files (their origin is known, so I can create a
rule for this issue), I have to expand the .gz file first and then fix
the file using the filter above. I then have two paths to load the xml
- either a zlib:// decompress stream or a straight local file.

I'd like to work out how to create a stream wrapper to allow me to say
SOMETHING like ...

$o_MySXI = new SimpleXMLIterator('xml.NoNumericTags://compress.zlib:///development/BadlyFormed.gz');

If this was possible, I'd be a LOT happier and could simply stream
from the .gz files without needing to hold onto anything.


Ideas/suggestions/examples/code gratefully received.

Regards,

Richard.

-- 
Richard Quadling
Twitter : EE : Zend : Fantasy Shopper
@RQuadling : http://e-e.com/M_248814.html : http://bit.ly/9O8vFY :
http://fan.sh/106/5tw

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux