forked from science-ation/science-ation
167 lines
5.5 KiB
PHP
167 lines
5.5 KiB
PHP
<?
|
|
|
|
/*
|
|
* This file is part of the Science-ation project
|
|
* Science-ation Website: https://science-ation.ca
|
|
*
|
|
* This file was part of the 'Science Fair In A Box' project
|
|
*
|
|
*
|
|
* Copyright (C) 2005 Sci-Tech Ontario Inc <info@scitechontario.org>
|
|
* Copyright (C) 2005 James Grant <james@lightbox.org>
|
|
* Copyright (C) 2024 AlgoLibre Inc. <science-ation@algolibre.io>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public
|
|
* License as published by the Free Software Foundation, version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
function xmlCreateRecurse($d)
|
|
{
|
|
global $indent;
|
|
global $output;
|
|
foreach ($d AS $key => $val) {
|
|
if (is_numeric($key)) {
|
|
if ($val['xml_type']) {
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= '<' . $val['xml_type'] . ">\n";
|
|
$indent++;
|
|
xmlCreateRecurse($val);
|
|
$indent--;
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= '</' . $val['xml_type'] . ">\n";
|
|
} else {
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= "<$key>\n";
|
|
$indent++;
|
|
xmlCreateRecurse($val);
|
|
$indent--;
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= "</$key>\n";
|
|
}
|
|
} else if (is_array($val)) {
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= "<$key>\n";
|
|
$indent++;
|
|
xmlCreateRecurse($val);
|
|
$indent--;
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= "</$key>\n";
|
|
} else {
|
|
if ($key != 'xml_type' && $key != 'projectid' && $key != 'projectdivisions_id') {
|
|
for ($x = 0; $x < $indent; $x++)
|
|
$output .= ' ';
|
|
$output .= "<$key>$val</$key>\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mainfunction to parse the XML defined by URL
|
|
function xml_parsexml($String)
|
|
{
|
|
global $Data;
|
|
$Encoding = xml_encoding($String);
|
|
$String = xml_deleteelements($String, '?');
|
|
$String = xml_deleteelements($String, '!');
|
|
$Data = xml_readxml($String, $Data, $Encoding);
|
|
return ($Data);
|
|
}
|
|
|
|
// Get encoding of xml
|
|
function xml_encoding($String)
|
|
{
|
|
if (substr_count($String, '<?xml')) {
|
|
$Start = strpos($String, '<?xml') + 5;
|
|
$End = strpos($String, '>', $Start);
|
|
$Content = substr($String, $Start, $End - $Start);
|
|
$EncodingStart = strpos($Content, 'encoding="') + 10;
|
|
$EncodingEnd = strpos($Content, '"', $EncodingStart);
|
|
$Encoding = substr($Content, $EncodingStart, $EncodingEnd - $EncodingStart);
|
|
} else {
|
|
$Encoding = '';
|
|
}
|
|
return $Encoding;
|
|
}
|
|
|
|
// Delete elements
|
|
function xml_deleteelements($String, $Char)
|
|
{
|
|
while (substr_count($String, "<$Char")) {
|
|
$Start = strpos($String, "<$Char");
|
|
$End = strpos($String, '>', $Start + 1) + 1;
|
|
$String = substr($String, 0, $Start) . substr($String, $End);
|
|
}
|
|
return $String;
|
|
}
|
|
|
|
// Read XML and transform into array
|
|
function xml_readxml($String, $Data, $Encoding = '')
|
|
{
|
|
while ($Node = xml_nextnode($String)) {
|
|
$TmpData = '';
|
|
$Start = strpos($String, '>', strpos($String, "<$Node")) + 1;
|
|
$End = strpos($String, "</$Node>", $Start);
|
|
$ThisContent = trim(substr($String, $Start, $End - $Start));
|
|
$String = trim(substr($String, $End + strlen($Node) + 3));
|
|
if (substr_count($ThisContent, '<')) {
|
|
$TmpData = xml_readxml($ThisContent, $TmpData, $Encoding);
|
|
$Data[$Node][] = $TmpData;
|
|
} else {
|
|
if ($Encoding == 'UTF-8') {
|
|
$ThisContent = utf8_decode($ThisContent);
|
|
}
|
|
$ThisContent = str_replace('>', '>', $ThisContent);
|
|
$ThisContent = str_replace('<', '<', $ThisContent);
|
|
$ThisContent = str_replace('"e;', '"', $ThisContent);
|
|
$ThisContent = str_replace(''', "'", $ThisContent);
|
|
$ThisContent = str_replace('&', '&', $ThisContent);
|
|
$Data[$Node][] = $ThisContent;
|
|
}
|
|
}
|
|
return $Data;
|
|
}
|
|
|
|
// Get next node
|
|
function xml_nextnode($String)
|
|
{
|
|
if (substr_count($String, '<') != substr_count($String, '/>')) {
|
|
$Start = strpos($String, '<') + 1;
|
|
while (substr($String, $Start, 1) == '/') {
|
|
if (substr_count($String, '<')) {
|
|
return '';
|
|
}
|
|
$Start = strpos($String, '<', $Start) + 1;
|
|
}
|
|
$End = strpos($String, '>', $Start);
|
|
$Node = substr($String, $Start, $End - $Start);
|
|
if ($Node[strlen($Node) - 1] == '/') {
|
|
$String = substr($String, $End + 1);
|
|
$Node = xml_nextnode($String);
|
|
} else {
|
|
if (substr_count($Node, ' ')) {
|
|
$Node = substr($Node, 0, strpos($String, ' ', $Start) - $Start);
|
|
}
|
|
}
|
|
return $Node;
|
|
}
|
|
}
|
|
|
|
?>
|