<?php


	/**
	 * Вернуть строку по DOMNode
	 * @param DOMNode $node Узел XML
	 * @return string
	 */
	function getXML($node)
	{
		if($node==null) return '';
		return $node->ownerDocument->saveXML($node);
	}
	/**
	 * Найти первый попавшийся узел с заданным именем nodeName.
	 * @param DOMNode $node Узел.
	 * @param string $nodename Название узла.
	 * @return DOMNode Найденный узел либо null.
	 */
	function findNode($node, $nodename)
	{
		if($node==null) return null;
		$nextNode = $node->firstChild;
		while ($nextNode != null)
		{
			if($nextNode->nodeName==$nodename)
			{
				return $nextNode;
			}
			$nextNode=$nextNode->nextSibling;
		}
		return null;
	}
	/**
	 * Найти первый попавшийся узел с заданным именем nodeName и атрибутом $attribute со значением $val.
	 * @param <type> $node
	 * @param <type> $nodename
	 * @param <type> $attribute
	 * @param <type> $val
	 * @return <type>
	 */
	function findNodeOnAttribute($node, $nodename,$attribute,$val)
	{
		if($node==null) return null;
		$nextNode = $node->firstChild;
		while ($nextNode != null)
		{
			if(($nextNode->nodeName==$nodename)&&($nextNode->getAttribute($attribute)==$val))
			{
				return $nextNode;
			}
			$nextNode=$nextNode->nextSibling;
		}
		return null;
	}
	/**
	 * Вернуть первый попавшийся узел среди всех дочерних (без рекурсии).
	 * @param XMLNode $node Родительский узел.
	 * @param String $nodename Название узла.
	 * @return XMLNode Найденный узел
	 */
	function findFirstNode($node, $nodename)
	{
		$mas=array();
		$pos=0;
		$mas[$pos] = $node->firstChild;
		while ($mas[$pos])
		{
			if($mas[$pos]->nodeName==$nodename)
			{
				return $mas[$pos];
			}
			if($mas[$pos]->firstChild)
			{
				$pos++;
				$mas[$pos]=$mas[$pos-1]->firstChild;
			}else
			{
				//если не идёт дальше пытаемся подняться в верх по дереву
				while (true)
				{
					$mas[$pos] = $mas[$pos]->nextSibling;
					if (!$mas[$pos])
					{ 
						if($pos>0){ $pos--; }else{ break; }
					}else
					{
						break;
					}
				}
			}
		}
		return '';
	}

	//рекурсию не буду использовать, обойдусь массивом вложенности
	function findFirstNodeOnAttribute($node, $nodename,$attribute,$val)
	{
		$mas=array();
		$pos=0;
		$mas[$pos] = $node->firstChild;
		while ($mas[$pos])
		{
			if(($mas[$pos]->nodeName==$nodename)&&($mas[$pos]->getAttribute($attribute)==$val))
			{
				return $mas[$pos];
			}
			if($mas[$pos]->firstChild)
			{
				$pos++;
				$mas[$pos]=$mas[$pos-1]->firstChild;
			}else
			{
				//если не идёт дальше пытаемся подняться в верх по дереву
				while (true)
				{
					$mas[$pos] = $mas[$pos]->nextSibling;
					if (!$mas[$pos])
					{ 
						if($pos>0){ $pos--; }else{ break; }
					}else
					{
						break;
					}
				}
			}
		}
		return '';
	}
	//найти узелы по пути "node1->node2"
	function findNodeOnPath($node, $path)
	{
		if($node==null) return null;
		$params=explode("/",$path);
		for($i=0;$i<count($params);$i++)
		{
			if($node==null) return null;
			$node=findNode($node,$params[$i]);
		}
		return $node;
	}
	/**
	 * Вернёт первую CDATA секцию если её нет то создаст.
	 * @param DOMNode $node Узел XML.
	 * @return DOMCdataSection Узел CDATA либо null.
	 */
	function getCdata($node)
	{
		if($node==null) return null;
		$result=findNode($node,'#cdata-section');
		if($result==null)
		{
			$result=$node->ownerDocument->createCDATASection('');
			$node->appendChild($result);
		}
		return $result;
	}
	
	/**
	 * Получить строку данных из первой попавшейся CDATA.
	 * @param DOMNode $node Узел XML.
	 * @return String Строка результата
	 */
	function getCdataValue($node)
	{
		$n=findNode($node,'#cdata-section');
		if($n!=null)
		{	return $n->nodeValue;
		}
		return '';
	}

