Location: PHPKode > scripts > DOM Query > DomQuery.php
<?php
if(version_compare(PHP_VERSION, '5.3.0', '<'))
	die('These classes are using Closures and other features that are available since PHP version 5.3.0. You are running PHP version '.PHP_VERSION.'. Please update your PHP.');

class DomQuery implements Iterator
{
	public static $prototype	= array();
	public $items				= array();
	protected $position			= 0;

	public function __construct($context)
	{
		if($context instanceof DomNode)
			$this->items[] = $context;
		elseif($context instanceof Iterator || $context instanceof DomNodeList || is_array($context))
		{
			foreach($context as $node)
				if($node instanceof DomNode)
					$this->items[] = $node;
		}
		else
			throw new Exception('Context must be instance of DomQuery, DomNode, DomNodeList or Array, but it is instance of '.get_class($context));
	}

	public function __call($method, $params)
	{
		$result = array();
		if(!isset(self::$prototype[$method]) || !(self::$prototype[$method] instanceof Closure))
			throw new Exception('Closure "'.$method.'" not found.');
		$closure = self::$prototype[$method];
		return $closure($this, $params);
	}

	public function get($index)
	{
		if(isset($this->items[$index]))
			return $this->items[$index];
	}

	public function each(Closure $method)
	{
		foreach($this->items as $index => $context)
			$method($context, $index);
		return $this;
	}

	public function rewind() {$this->position = 0;}
	public function valid() {return $this->position < count($this->items);}
	public function key() {return $this->position;}
	public function current() {return $this->items[$this->position];}
	public function next() {$this->position++;}

	public function __toString()
	{
		return '';
	}
}

DomQuery::$prototype = array
	( 'find' => function(DomQuery $context, Array $params)
		{
			$result = array();
			foreach($context->items as $item)
			{
				$xpath = new DomXPath($item instanceof DomDocument ? $item : $item->ownerDocument);
				foreach($xpath->query($params[0], $item) as $resultNode)
					$result[] = $resultNode;
			}
			return new DomQuery($result);
		}
	, 'val' => function(DomQuery $context, Array $params)
		{
			if(isset($params[0]))
			{
				$context->each(
					function($node) use ($params)
					{
						while($firstChild = $node->firstChild)
							$node->removeChild($firstChild);
						$node->appendChild($node->ownerDocument->createTextNode($params[0]));
					}
				);
				return $context;
			}
			return $context->get(0)->nodeValue;
		}
	, 'attr' => function(DomQuery $context, Array $params)
		{
			if(isset($params[1]))
			{
				$context->each(
					function($node) use ($params)
					{
						$node->setAttribute($params[0], $params[1]);
					}
				);
				return $context;
			}
			return $context->get(0)->getAttribute($params[0]);
		}
	, 'removeAttr' => function(DomQuery $context, Array $params)
		{
			$context->each(function($node) use ($params) {$node->removeAttribute($params[0]);});
			return $context;
		}
	, 'xml' => function(DomQuery $context, Array $params)
		{
			if(!isset($params[0]))
				return $context->get(0);
			$xml = new DomDocument();
			if(strlen($params[0]) < 4)
				$new = $xml->createTextNode('');
			else
			{
				$xml->preserveWhiteSpace = false;
				$xml->formatOutput = true;
				$xml->loadXML($params[0]);
				$new = $xml->documentElement;
			}
			$newNodes = array();
			foreach($context->items as $node)
			{
				if($node->parentNode)
				{
					while($firstChild = $node->firstChild)
						$node->removeChild($firstChild);
					$node->appendChild($newNodes[] = $node->ownerDocument->importNode($new));
				}
			}
			return $context;
		}
	);

function DQ($context)
{
	return new DomQuery($context);
}
function DomQuery($context)
{
	return new DomQuery($context);
}
Return current item: DOM Query