• Модуль: xmpp
  • Путь к файлу: ~/bitrix/modules/xmpp/classes/parser.php
  • Класс: CXMPPParser
  • Вызов: CXMPPParser::Parse
function Parse()
{
	$r = 0;
	while(is_numeric($r = $this->ReadTags($r)));
	if ($r !== true)
		return;

	$arTmpTags = array();
	$child = array();
	$level_items = array();
	$level = 0;
	$bLastOpenTag = false;
	foreach($this->arTagList as $arTag)
	{
		$name = $this->GetName($arTag[0]);

		if (mb_substr($arTag[0], -2) == '/>') // self closed
		{
			$val = array(
				'.' => $this->GetAttr($arTag[0]),
				'#' => ''
			);

			if (!$level_items[$level][$name])
				$level_items[$level][$name] = $val;
			elseif (!$level_items[$level][$name][0])
				$level_items[$level][$name] = array($level_items[$level][$name], $val);
			else
				$level_items[$level][$name][] = $val;

			$child = $level_items[$level];
			$bLastOpenTag = 0;
		}
		elseif (mb_substr($arTag[0], 0, 2) != 'GetName($arOpenTag[0]);

			if ($open_name == $name)
			{
				if ($bLastOpenTag) // string
				{
					$start = $arOpenTag[2];
					$end = $arTag[1];
					$val = array('#' => mb_substr($this->raw, $start, $end - $start));
				}
				else
					$val = $child;

				$val = array_merge(array('.' => $this->GetAttr($arOpenTag[0])), $val);

				if (!$level_items[$level][$name])
					$level_items[$level][$name] = $val;
				elseif (!$level_items[$level][$name][0])
					$level_items[$level][$name] = array($level_items[$level][$name], $val);
				else
					$level_items[$level][$name][] = $val;

				$child = $level_items[$level];
			}
			else
				return; // close non current tag

			$bLastOpenTag = 0;
		}
	}
	if ($level != 0) // opened or non closed tags left
		return;

	$this->array = $child;
	return true;
}