spip_nursit/ecrire/inc/simplexml_to_array.php
2023-06-01 17:30:12 +02:00

108 lines
2.9 KiB
PHP

<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2019 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Transforme un texte XML en tableau PHP
*
* @param string|object $u
* @param bool $utiliser_namespace
* @return array
*/
function inc_simplexml_to_array_dist($u, $utiliser_namespace = false) {
// decoder la chaine en SimpleXML si pas deja fait
if (is_string($u)) {
$u = simplexml_load_string($u);
}
return array('root' => @xmlObjToArr($u, $utiliser_namespace));
}
/**
* Transforme un objet SimpleXML en tableau PHP
* http://www.php.net/manual/pt_BR/book.simplexml.php#108688
* xaviered at gmail dot com 17-May-2012 07:00
*
* @param object $obj
* @param bool $utiliser_namespace
* @return array
**/
function xmlObjToArr($obj, $utiliser_namespace = false) {
$tableau = array();
// Cette fonction getDocNamespaces() est longue sur de gros xml. On permet donc
// de l'activer ou pas suivant le contenu supposé du XML
if (is_object($obj)) {
if (is_array($utiliser_namespace)) {
$namespace = $utiliser_namespace;
} else {
if ($utiliser_namespace) {
$namespace = $obj->getDocNamespaces(true);
}
$namespace[null] = null;
}
$name = strtolower((string)$obj->getName());
$text = trim((string)$obj);
if (strlen($text) <= 0) {
$text = null;
}
$children = array();
$attributes = array();
// get info for all namespaces
foreach ($namespace as $ns => $nsUrl) {
// attributes
$objAttributes = $obj->attributes($ns, true);
foreach ($objAttributes as $attributeName => $attributeValue) {
$attribName = strtolower(trim((string)$attributeName));
$attribVal = trim((string)$attributeValue);
if (!empty($ns)) {
$attribName = $ns . ':' . $attribName;
}
$attributes[$attribName] = $attribVal;
}
// children
$objChildren = $obj->children($ns, true);
foreach ($objChildren as $childName => $child) {
$childName = strtolower((string)$childName);
if (!empty($ns)) {
$childName = $ns . ':' . $childName;
}
$children[$childName][] = xmlObjToArr($child, $namespace);
}
}
$tableau = array(
'name' => $name,
);
if ($text) {
$tableau['text'] = $text;
}
if ($attributes) {
$tableau['attributes'] = $attributes;
}
if ($children) {
$tableau['children'] = $children;
}
}
return $tableau;
}