- Модуль: 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) != '') // opener
{
$level++;
$arTmpTags[] = $arTag;
$bLastOpenTag = 1;
}
else // closer
{
unset($level_items[$level]);
$level--;
$arOpenTag = array_pop($arTmpTags);
$open_name = $this->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;
}