* Copyright (C) 2005 James Grant * Copyright (C) 2024 AlgoLibre Inc. * * * 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 .= '\n"; } else { for ($x = 0; $x < $indent; $x++) $output .= ' '; $output .= "<$key>\n"; $indent++; xmlCreateRecurse($val); $indent--; for ($x = 0; $x < $indent; $x++) $output .= ' '; $output .= "\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 .= "\n"; } else { if ($key != 'xml_type' && $key != 'projectid' && $key != 'projectdivisions_id') { for ($x = 0; $x < $indent; $x++) $output .= ' '; $output .= "<$key>$val\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, '', $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, "", $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; } }