diff --git a/include/class_xml.inc b/include/class_xml.inc index 32351b7269ac915d290ceb2e6cf5d752c7195ac7..1a886e6f1c45d7f900e6356ab89d3012ceb1edbb 100644 --- a/include/class_xml.inc +++ b/include/class_xml.inc @@ -1,8 +1,9 @@ <?php /* This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2003-2010 Cajus Pollmeier - Copyright (C) 2011-2016 FusionDirectory + Copyright (C) 2011-2020 FusionDirectory 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 @@ -62,107 +63,118 @@ class xml return; } - //Initializations + // Initializations $xml_array = []; - $current = &$xml_array; //Refference + // Reference + $current = &$xml_array; - //Go through the tags. - $repeated_tag_index = [];//Multiple tags with same name will be turned into an array + // Go through the tags. + // Multiple tags with same name will be turned into an array + $repeated_tag_index = []; foreach ($xml_values as $data) { - unset($attributes, $value);//Remove existing values, or there will be trouble - - //This command will extract these variables into the foreach scope - // tag(string), type(string), level(int), attributes(array). - extract($data);//We could use the array by itself, but this cooler. - $result = []; $attributes_data = []; - if (isset($value)) { + if (isset($data['value'])) { if ($priority == 'tag') { - $result = $value; + $result = $data['value']; } else { - //Put the value in a assoc array if we are in the 'Attribute' mode - $result['value'] = $value; + // Put the value in a assoc array if we are in the 'Attribute' mode + $result['value'] = $data['value']; } } //Set the attributes too. - if (isset($attributes) and $get_attributes) { - foreach ($attributes as $attr => $val) { + if (isset($data['attributes']) and $get_attributes) { + foreach ($data['attributes'] as $attr => $val) { if ($priority == 'tag') { $attributes_data[$attr] = $val; } else { - //Set all the attributes in a array called 'attr' + // Set all the attributes in a array called 'attr' $result['attr'][$attr] = $val; } } } - //See tag status and do the needed. - if ($type == "open") {//The starting of the tag '<tag>' - $parent[$level - 1] = &$current; - if (!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag - $current[$tag] = $result; + // See tag status and do the needed. + if ($data['type'] == 'open') { + // The starting of the tag '<tag>' + $parent[$data['level'] - 1] = &$current; + if (!is_array($current) or (!in_array($data['tag'], array_keys($current)))) { + // Insert New tag + $current[$data['tag']] = $result; if ($attributes_data) { - $current[$tag. '_attr'] = $attributes_data; + $current[$data['tag']. '_attr'] = $attributes_data; } - $repeated_tag_index[$tag.'_'.$level] = 1; - - $current = &$current[$tag]; - } else { //There was another element with the same tag name + $repeated_tag_index[$data['tag'].'_'.$data['level']] = 1; - if (isset($current[$tag][0])) {//If there is a 0th element it is already an array - $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; - $repeated_tag_index[$tag.'_'.$level]++; - } else {//This section will make the value an array if multiple tags with the same name appear together - $current[$tag] = [$current[$tag],$result];//This will combine the existing item and the new item together to make an array - $repeated_tag_index[$tag.'_'.$level] = 2; + $current = &$current[$data['tag']]; + } else { + // There was another element with the same tag name - if (isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well - $current[$tag]['0_attr'] = $current[$tag.'_attr']; - unset($current[$tag.'_attr']); + if (isset($current[$data['tag']][0])) { + // If there is a 0th element it is already an array + $current[$data['tag']][$repeated_tag_index[$data['tag'].'_'.$data['level']]] = $result; + $repeated_tag_index[$data['tag'].'_'.$data['level']]++; + } else { + // This section will make the value an array if multiple tags with the same name appear together + // This will combine the existing item and the new item together to make an array + $current[$data['tag']] = [$current[$data['tag']],$result]; + $repeated_tag_index[$data['tag'].'_'.$data['level']] = 2; + + if (isset($current[$data['tag'].'_attr'])) { + // The attribute of the last(0th) tag must be moved as well + $current[$data['tag']]['0_attr'] = $current[$data['tag'].'_attr']; + unset($current[$data['tag'].'_attr']); } } - $last_item_index = $repeated_tag_index[$tag.'_'.$level] - 1; - $current = &$current[$tag][$last_item_index]; + $last_item_index = $repeated_tag_index[$data['tag'].'_'.$data['level']] - 1; + $current = &$current[$data['tag']][$last_item_index]; } - } elseif ($type == "complete") { //Tags that ends in 1 line '<tag />' - //See if the key is already taken. - if (!isset($current[$tag])) { //New Key - $current[$tag] = $result; - $repeated_tag_index[$tag.'_'.$level] = 1; + } elseif ($data['type'] == "complete") { + // Tags that ends in 1 line '<tag />' + // See if the key is already taken. + if (!isset($current[$data['tag']])) { + // New Key + $current[$data['tag']] = $result; + $repeated_tag_index[$data['tag'].'_'.$data['level']] = 1; if ($priority == 'tag' and $attributes_data) { - $current[$tag. '_attr'] = $attributes_data; + $current[$data['tag']. '_attr'] = $attributes_data; } - } else { //If taken, put all things inside a list(array) - if (isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array... + } else { + // If taken, put all things inside a list(array) + if (isset($current[$data['tag']][0]) and is_array($current[$data['tag']])) { + // If it is already an array... // ...push the new element into that array. - $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; + $current[$data['tag']][$repeated_tag_index[$data['tag'].'_'.$data['level']]] = $result; if ($priority == 'tag' and $get_attributes and $attributes_data) { - $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; + $current[$data['tag']][$repeated_tag_index[$data['tag'].'_'.$data['level']] . '_attr'] = $attributes_data; } - $repeated_tag_index[$tag.'_'.$level]++; + $repeated_tag_index[$data['tag'].'_'.$data['level']]++; } else { //If it is not an array... - $current[$tag] = [$current[$tag],$result]; //...Make it an array using using the existing value and the new value - $repeated_tag_index[$tag.'_'.$level] = 1; + //...Make it an array using using the existing value and the new value + $current[$data['tag']] = [$current[$data['tag']],$result]; + $repeated_tag_index[$data['tag'].'_'.$data['level']] = 1; if ($priority == 'tag' and $get_attributes) { - if (isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well - $current[$tag]['0_attr'] = $current[$tag.'_attr']; - unset($current[$tag.'_attr']); + if (isset($current[$data['tag'].'_attr'])) { + // The attribute of the last(0th) tag must be moved as well + $current[$data['tag']]['0_attr'] = $current[$data['tag'].'_attr']; + unset($current[$data['tag'].'_attr']); } if ($attributes_data) { - $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; + $current[$data['tag']][$repeated_tag_index[$data['tag'].'_'.$data['level']] . '_attr'] = $attributes_data; } } - $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken + // 0 and 1 index is already taken + $repeated_tag_index[$data['tag'].'_'.$data['level']]++; } } - } elseif ($type == 'close') { //End of tag '</tag>' - $current = &$parent[$level - 1]; + } elseif ($data['type'] == 'close') { + // End of tag '</tag>' + $current = &$parent[$data['level'] - 1]; } }