Here's a simple function to convert an XML string to an array -
<?php
// PHP5.3 and above only
function parse($str) {
$f = function($iter) {
foreach($iter as $key=>$val)
$arr[$key][] = ($iter->hasChildren())?
call_user_func (__FUNCTION__, $val)
: strval($val);
return $arr;
};
return $f(new SimpleXmlIterator($str, null));
}
?>
PHP 5.2 and below do not have anonymous functions.
But you can create a helper function to achieve the same thing -
<?php
function parse($str) {
return parseHelper(new SimpleXmlIterator($str, null));
}
function parseHelper($iter) {
foreach($iter as $key=>$val)
$arr[$key][] = ($iter->hasChildren())?
call_user_func (__FUNCTION__, $val)
: strval($val);
return $arr;
}
?>
Using it is straightforward enough -
<?php
$xml = '
<movies>
<movie>abcd</movie>
<movie>efgh</movie>
<movie>hijk</movie>
</movies>';
var_dump(parse($xml));
?>
This will output -
array
'movie' =>
array
0 => string 'abcd' (length=4)
1 => string 'efgh' (length=4)
2 => string 'hijk' (length=4)
La clase SimpleXMLIterator
(PHP 5 >= 5.1.0)
Introducción
El clase SimpleXMLIterator proporciona una iteración recursiva sobre todos los nodos de un objeto SimpleXMLElement.
Sinopsis de la Clase
SimpleXMLIterator
extends
SimpleXMLElement
implements
RecursiveIterator
,
Traversable
,
Iterator
,
Countable
{
/* Métodos */
/* Métodos heredados */
final public SimpleXMLElement::__construct
( string
$data
[, int $options = 0
[, bool $data_is_url = false
[, string $ns = ""
[, bool $is_prefix = false
]]]] )
public void SimpleXMLElement::addAttribute
( string
$name
[, string $value
[, string $namespace
]] )
public SimpleXMLElement SimpleXMLElement::addChild
( string
$name
[, string $value
[, string $namespace
]] )
public SimpleXMLElement SimpleXMLElement::attributes
([ string
}$ns = NULL
[, bool $is_prefix = false
]] )Tabla de contenidos
- SimpleXMLIterator::current — Devuelve el elemento actual
- SimpleXMLIterator::getChildren — Devuelve los sub elementos de el elemento actual
- SimpleXMLIterator::hasChildren — Comprueba si el elemento actual tiene sub elemento
- SimpleXMLIterator::key — Devuelve la clave actual
- SimpleXMLIterator::next — Mueve al siguiente elemento
- SimpleXMLIterator::rewind — Rebobina hasta el primer elemento
- SimpleXMLIterator::valid — Comprueba si el elemento actual es válido
ajnsit dot NOSPAM at gmail dot com
17-Mar-2011 10:14
ratfactor at gmail dot com
19-Jul-2009 05:08
The documentation is a bit sparse for SimpleXmlIterator. Here is an example showing the use of its methods. xml2Array and sxiToArray work together to convert an XML document to an associative array structure.
The contents of cats.xml:
======================================
<cats>
<cat>
<name>Jack</name>
<age>2</age>
<color>grey</color>
<color>white</color>
</cat>
<cat>
<name>Maxwell</name>
<age>12</age>
<color>orange</color>
<color>black</color>
</cat>
</cats>
======================================
<?php
function xml2array($fname){
$sxi = new SimpleXmlIterator($fname, null, true);
return sxiToArray($sxi);
}
function sxiToArray($sxi){
$a = array();
for( $sxi->rewind(); $sxi->valid(); $sxi->next() ) {
if(!array_key_exists($sxi->key(), $a)){
$a[$sxi->key()] = array();
}
if($sxi->hasChildren()){
$a[$sxi->key()][] = sxiToArray($sxi->current());
}
else{
$a[$sxi->key()][] = strval($sxi->current());
}
}
return $a;
}
// Read cats.xml and print the results:
$catArray = xml2array('cats.xml');
print_r($catArray);
?>
Results (reformatted a bit for compactness and clarity):
======================================
Array(
[cat] => Array(
[0] => Array(
[name] => Array( [0] => Jack )
[age] => Array( [0] => 2 )
[color] => Array( [0] => grey,
[1] => white )
)
[1] => Array(
[name] => Array( [0] => Maxwell )
[age] => Array( [0] => 12 )
[color] => Array( [0] => orange
[1] => black )
)
)
)
David Lanstein
17-Jan-2009 06:40
Unlike the DirectoryIterator, for one, you'll need to call $it->rewind() before using the iterator in a for() or while() loop. Calling foreach() does rewind the iterator before iteration.
