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 '';
|
||
}
|
||
|