Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

XmlUtils.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 7.92 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\Config\Util;
013   
014  /**
015   * XMLUtils is a bunch of utility methods to XML operations.
016   *
017   * This class contains static methods only and is not meant to be instantiated.
018   *
019   * @author Fabien Potencier <fabien@symfony.com>
020   * @author Martin Hasoň <martin.hason@gmail.com>
021   */
022  class XmlUtils
023  {
024      /**
025       * This class should not be instantiated.
026       */
027      private function __construct()
028      {
029      }
030   
031      /**
032       * Loads an XML file.
033       *
034       * @param string               $file             An XML file path
035       * @param string|callable|null $schemaOrCallable An XSD schema file path, a callable, or null to disable validation
036       *
037       * @return \DOMDocument
038       *
039       * @throws \InvalidArgumentException When loading of XML file returns error
040       */
041      public static function loadFile($file, $schemaOrCallable = null)
042      {
043          $content = @file_get_contents($file);
044          if ('' === trim($content)) {
045              throw new \InvalidArgumentException(sprintf('File %s does not contain valid XML, it is empty.', $file));
046          }
047   
048          $internalErrors = libxml_use_internal_errors(true);
049          $disableEntities = libxml_disable_entity_loader(true);
050          libxml_clear_errors();
051   
052          $dom = new \DOMDocument();
053          $dom->validateOnParse = true;
054          if (!$dom->loadXML($content, LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) {
055              libxml_disable_entity_loader($disableEntities);
056   
057              throw new \InvalidArgumentException(implode("\n", static::getXmlErrors($internalErrors)));
058          }
059   
060          $dom->normalizeDocument();
061   
062          libxml_use_internal_errors($internalErrors);
063          libxml_disable_entity_loader($disableEntities);
064   
065          foreach ($dom->childNodes as $child) {
066              if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
067                  throw new \InvalidArgumentException('Document types are not allowed.');
068              }
069          }
070   
071          if (null !== $schemaOrCallable) {
072              $internalErrors = libxml_use_internal_errors(true);
073              libxml_clear_errors();
074   
075              $e = null;
076              if (is_callable($schemaOrCallable)) {
077                  try {
078                      $valid = call_user_func($schemaOrCallable, $dom, $internalErrors);
079                  } catch (\Exception $e) {
080                      $valid = false;
081                  }
082              } elseif (!is_array($schemaOrCallable) && is_file((string) $schemaOrCallable)) {
083                  $schemaSource = file_get_contents((string) $schemaOrCallable);
084                  $valid = @$dom->schemaValidateSource($schemaSource);
085              } else {
086                  libxml_use_internal_errors($internalErrors);
087   
088                  throw new \InvalidArgumentException('The schemaOrCallable argument has to be a valid path to XSD file or callable.');
089              }
090   
091              if (!$valid) {
092                  $messages = static::getXmlErrors($internalErrors);
093                  if (empty($messages)) {
094                      $messages = array(sprintf('The XML file "%s" is not valid.', $file));
095                  }
096                  throw new \InvalidArgumentException(implode("\n", $messages), 0, $e);
097              }
098          }
099   
100          libxml_clear_errors();
101          libxml_use_internal_errors($internalErrors);
102   
103          return $dom;
104      }
105   
106      /**
107       * Converts a \DomElement object to a PHP array.
108       *
109       * The following rules applies during the conversion:
110       *
111       *  * Each tag is converted to a key value or an array
112       *    if there is more than one "value"
113       *
114       *  * The content of a tag is set under a "value" key (<foo>bar</foo>)
115       *    if the tag also has some nested tags
116       *
117       *  * The attributes are converted to keys (<foo foo="bar"/>)
118       *
119       *  * The nested-tags are converted to keys (<foo><foo>bar</foo></foo>)
120       *
121       * @param \DomElement $element     A \DomElement instance
122       * @param bool        $checkPrefix Check prefix in an element or an attribute name
123       *
124       * @return array A PHP array
125       */
126      public static function convertDomElementToArray(\DOMElement $element, $checkPrefix = true)
127      {
128          $prefix = (string) $element->prefix;
129          $empty = true;
130          $config = array();
131          foreach ($element->attributes as $name => $node) {
132              if ($checkPrefix && !in_array((string) $node->prefix, array('', $prefix), true)) {
133                  continue;
134              }
135              $config[$name] = static::phpize($node->value);
136              $empty = false;
137          }
138   
139          $nodeValue = false;
140          foreach ($element->childNodes as $node) {
141              if ($node instanceof \DOMText) {
142                  if ('' !== trim($node->nodeValue)) {
143                      $nodeValue = trim($node->nodeValue);
144                      $empty = false;
145                  }
146              } elseif ($checkPrefix && $prefix != (string) $node->prefix) {
147                  continue;
148              } elseif (!$node instanceof \DOMComment) {
149                  $value = static::convertDomElementToArray($node, $checkPrefix);
150   
151                  $key = $node->localName;
152                  if (isset($config[$key])) {
153                      if (!is_array($config[$key]) || !is_int(key($config[$key]))) {
154                          $config[$key] = array($config[$key]);
155                      }
156                      $config[$key][] = $value;
157                  } else {
158                      $config[$key] = $value;
159                  }
160   
161                  $empty = false;
162              }
163          }
164   
165          if (false !== $nodeValue) {
166              $value = static::phpize($nodeValue);
167              if (count($config)) {
168                  $config['value'] = $value;
169              } else {
170                  $config = $value;
171              }
172          }
173   
174          return !$empty ? $config : null;
175      }
176   
177      /**
178       * Converts an xml value to a PHP type.
179       *
180       * @param mixed $value
181       *
182       * @return mixed
183       */
184      public static function phpize($value)
185      {
186          $value = (string) $value;
187          $lowercaseValue = strtolower($value);
188   
189          switch (true) {
190              case 'null' === $lowercaseValue:
191                  return;
192              case ctype_digit($value):
193                  $raw = $value;
194                  $cast = (int) $value;
195   
196                  return '0' == $value[0] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
197              case isset($value[1]) && '-' === $value[0] && ctype_digit(substr($value, 1)):
198                  $raw = $value;
199                  $cast = (int) $value;
200   
201                  return '0' == $value[1] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
202              case 'true' === $lowercaseValue:
203                  return true;
204              case 'false' === $lowercaseValue:
205                  return false;
206              case isset($value[1]) && '0b' == $value[0].$value[1]:
207                  return bindec($value);
208              case is_numeric($value):
209                  return '0x' === $value[0].$value[1] ? hexdec($value) : (float) $value;
210              case preg_match('/^0x[0-9a-f]++$/i', $value):
211                  return hexdec($value);
212              case preg_match('/^(-|\+)?[0-9]+(\.[0-9]+)?$/', $value):
213                  return (float) $value;
214              default:
215                  return $value;
216          }
217      }
218   
219      protected static function getXmlErrors($internalErrors)
220      {
221          $errors = array();
222          foreach (libxml_get_errors() as $error) {
223              $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
224                  LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
225                  $error->code,
226                  trim($error->message),
227                  $error->file ?: 'n/a',
228                  $error->line,
229                  $error->column
230              );
231          }
232   
233          libxml_clear_errors();
234          libxml_use_internal_errors($internalErrors);
235   
236          return $errors;
237      }
238  }
239