php - simplexmlelement - Lanzamiento recursivo desde SimpleXMLObject a Array
xml to array php (4)
Necesito lanzar recursivamente un PHP SimpleXMLObject a una matriz. El problema es que cada elemento secundario también es un PHP SimpleXMLElement.
es posible?
Es posible. Esta es una función recursiva que imprime las etiquetas de los elementos principales y las etiquetas + contenidos de los elementos que no tienen más hijos. Puede modificarlo para construir una matriz:
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";
}
No probé esta, pero parece que lo hace:
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;
}
Tomado de http://www.codingforums.com/showthread.php?t=87283
No veo el punto, ya que SimpleXMLObject puede ser amenazado como matrices de todos modos ...
Pero si realmente lo necesita, simplemente revise la respuesta de chassagnette en este hilo o esta publicación en un foro.
json_decode(json_encode((array) simplexml_load_string($obj)), 1);