Первая копия
This commit is contained in:
170
metadata/include/xmltools.php
Normal file
170
metadata/include/xmltools.php
Normal file
@ -0,0 +1,170 @@
|
||||
<?
|
||||
/**
|
||||
* Вернуть строку по 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 '';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user