Ho bisogno di trasmettere in modo ricorsivo un oggetto SimpleXMLObject di PHP a un array. Il problema è che ogni subelemento è anche un SimpleXMLElement di PHP.Cast ricorsivo da SimpleXMLObject a Array
È possibile?
Ho bisogno di trasmettere in modo ricorsivo un oggetto SimpleXMLObject di PHP a un array. Il problema è che ogni subelemento è anche un SimpleXMLElement di PHP.Cast ricorsivo da SimpleXMLObject a Array
È possibile?
json_decode(json_encode((array) simplexml_load_string($obj)), 1);
non prova questo, ma questo sembra avere fatto:
function convertXmlObjToArr($obj, &$arr)
{
$children = $obj->children();
foreach ($children as $elementName => $node)
{
$nextIdx = count($arr);
$arr[$nextIdx] = array();
$arr[$nextIdx]['@name'] = strtolower((string)$elementName);
$arr[$nextIdx]['@attributes'] = array();
$attributes = $node->attributes();
foreach ($attributes as $attributeName => $attributeValue)
{
$attribName = strtolower(trim((string)$attributeName));
$attribVal = trim((string)$attributeValue);
$arr[$nextIdx]['@attributes'][$attribName] = $attribVal;
}
$text = (string)$node;
$text = trim($text);
if (strlen($text) > 0)
{
$arr[$nextIdx]['@text'] = $text;
}
$arr[$nextIdx]['@children'] = array();
convertXmlObjToArr($node, $arr[$nextIdx]['@children']);
}
return;
}
Tratto da http://www.codingforums.com/showthread.php?t=87283
Questo non ha funzionato per me –
Non so come questo "non funzioni" per gli altri, ma fa il lavoro di iterare attraverso tutti i bambini e gli attributi. –
non legge CDATA – reggie
E 'possibile. Questa è una funzione ricorsiva che stampa i tag degli elementi parent e i tag + il contenuto degli elementi che non hanno più figli. È possibile modificare per costruire un array:
foreach($simpleXmlObject as $element)
{
recurse($element);
}
function recurse($parent)
{
echo '<' . $parent->getName() . '>' . "\n";
foreach($parent->children() as $child)
{
if(count($child->children()) > 0)
{
recurse($child);
}
else
{
echo'<' . $child->getName() . '>';
echo iconv('UTF-8', 'ISO-8859-1', $child);
echo '</' . $child->getName() . '>' . "\n";
}
}
echo'</' . $parent->getName() . '>' . "\n";
}
non vedo il punto dal SimpleXMLObject può essere filettate come gli array comunque ...
Ma se si ha realmente bisogno che, basta controllare la risposta di Chassagnette di in this thread o this post in un forum.
Fatta eccezione per la situazione in cui si desidera archiviarlo in una sessione, ottenere 'Serializzazione di' SimpleXMLElement 'non è consentito' quando lo provo. Pertanto il casting su array è utile –
@GromBeestje: l'XML è già serializzato. Non c'è alcun problema per memorizzare una stringa in una sessione :) – hakre
L'analisi della stringa XML ogni volta che lo script viene caricato sembra inefficiente, quindi penso che abbia senso archiviare un modulo analizzato. –
intelligente! Non avrei mai pensato di farlo. –
Ti avrei dato 100 upvotes se possibile. È semplicemente fantastico :) –
Intelligente ma leggibile, manutenibile ed elegante. – Eddified