This commit is contained in:
2024-03-25 23:13:12 +05:00
parent ba933a0712
commit 975d9ee310
16 changed files with 4710 additions and 0 deletions

View File

@ -0,0 +1,172 @@
<?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 '';
}