171 lines
4.1 KiB
PHP
171 lines
4.1 KiB
PHP
<?
|
|
/**
|
|
* Вернуть строку по DOMNode
|
|
* @param DOMNode $node Узел XML
|
|
* @return Строка
|
|
*/
|
|
function getXML($node)
|
|
{
|
|
if($node==null) return '';
|
|
return $node->ownerDocument->saveXML($node);
|
|
}
|
|
/**
|
|
* Найти первый попавшийся узел с заданным именем nodeName.
|
|
* @param DOMNode $node Узел.
|
|
* @param Строка $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 '';
|
|
}
|
|
|