Files
Metadata_PHP/metadata/include/xmltools.php
2020-02-27 09:40:17 +06:00

171 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
/**
* Вернуть строку по 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 '';
}