PHP 8.5.0 Alpha 2 available for testing

SimpleXMLElement::children

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::childrenBusca los hijos de un nodo dado

Descripción

public SimpleXMLElement::children(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement

Este método busca los hijos de un elemento. El resultado sigue las reglas de la iteración normal.

Nota: SimpleXML añade propiedades iterativas para casi todos sus métodos. Estas no pueden ser vistas utilizando var_dump() o cualquier otra función que examine los objetos.

Parámetros

namespaceOrPrefix

Un espacio de nombres XML.

isPrefix

Si isPrefix vale true, namespaceOrPrefix será considerado como un prefijo. Si vale false, namespaceOrPrefix será considerado como una URL hacia un espacio de nombres.

Valores devueltos

Devuelve un elemento SimpleXMLElement si el nodo tiene un hijo o no, excepto si el nodo representa un atributo, en cuyo caso se devuelve null.

Ejemplos

Ejemplo #1 Recorrido de un pseudo-array children()

<?php
$xml
= new SimpleXMLElement(
'<person>
<child role="son">
<child role="daughter"/>
</child>
<child role="daughter">
<child role="son">
<child role="son"/>
</child>
</child>
</person>'
);

foreach (
$xml->children() as $second_gen) {
echo
' The person begot a ' . $second_gen['role'];

foreach (
$second_gen->children() as $third_gen) {
echo
' who begot a ' . $third_gen['role'] . ';';

foreach (
$third_gen->children() as $fourth_gen) {
echo
' and that ' . $third_gen['role'] .
' begot a ' . $fourth_gen['role'];
}
}
}
?>

El ejemplo anterior mostrará :

The person begot a son who begot a daughter; The person
begot a daughter who begot a son; and that son begot a son

Ejemplo #2 Uso de espacios de nombres

<?php
$xml
= '<example xmlns:foo="my.foo.urn">
<foo:a>Apple</foo:a>
<foo:b>Banana</foo:b>
<c>Cherry</c>
</example>'
;

$sxe = new SimpleXMLElement($xml);

$kids = $sxe->children('foo');
var_dump(count($kids));

$kids = $sxe->children('foo', TRUE);
var_dump(count($kids));

$kids = $sxe->children('my.foo.urn');
var_dump(count($kids));

$kids = $sxe->children('my.foo.urn', TRUE);
var_dump(count($kids));

$kids = $sxe->children();
var_dump(count($kids));
?>
int(0)
int(2)
int(2)
int(0)
int(1)

Ver también

add a note

User Contributed Notes 4 notes

up
13
aero
18 years ago
Here's a simple, recursive, function to transform XML data into pseudo E4X syntax ie. root.child.value = foobar

<?php
error_reporting
(E_ALL);

$xml = new SimpleXMLElement(
'<Patriarch>
<name>Bill</name>
<wife>
<name>Vi</name>
</wife>
<son>
<name>Bill</name>
</son>
<daughter>
<name>Jeri</name>
<husband>
<name>Mark</name>
</husband>
<son>
<name>Greg</name>
</son>
<son>
<name>Tim</name>
</son>
<son>
<name>Mark</name>
</son>
<son>
<name>Josh</name>
<wife>
<name>Kristine</name>
</wife>
<son>
<name>Blake</name>
</son>
<daughter>
<name>Liah</name>
</daughter>
</son>
</daughter>
</Patriarch>'
);

RecurseXML($xml);

function
RecurseXML($xml,$parent="")
{
$child_count = 0;
foreach(
$xml as $key=>$value)
{
$child_count++;
if(
RecurseXML($value,$parent.".".$key) == 0) // no childern, aka "leaf node"
{
print(
$parent . "." . (string)$key . " = " . (string)$value . "<BR>\n");
}
}
return
$child_count;
}

?>

The output....

.name = Bill
.wife.name = Vi
.son.name = Bill
.daughter.name = Jeri
.daughter.husband.name = Mark
.daughter.son.name = Greg
.daughter.son.name = Tim
.daughter.son.name = Mark
.daughter.son.name = Josh
.daughter.son.wife.name = Kristine
.daughter.son.son.name = Blake
.daughter.son.daughter.name = Liah
up
7
Sebastian
19 years ago
Just a quick addition:

If you need to access a child node which contains a dash, you need to encapsulate it with {""}.

For example:
<?php
foreach ($domain->domain-listing as $product) {
}
?>

The example above doesn't work because of the dash. But instead you need to use:
<?php
foreach ($domain->{"domain-listing"} as $product) {
}
?>

At least for me the second example works perfectly fine.
up
2
transglobe at gmx dot de
17 years ago
I made a slightly differnt approch towards the RecurseXML function. Beeing hungry I had problems with the code, as it did just overwrite two <maincourse>s. So here is what I did:

<?php

$xml
= new SimpleXMLElement(
'<meal>
<type>Lunch</type>
<time>12:30</time>
<menu>
<entree>salad</entree>
<maincourse>
<part>ships</part>
<part>steak</part>
</maincourse>
<maincourse>
<part>fisch</part>
<part>rice</part>
</maincourse>
<maincourse>
<part>wine</part>
<part>cheese</part>
</maincourse>
</menu>
</meal>'
);

$vals = array();
RecurseXML($xml,$vals);

foreach(
$vals as $key=>$value)
print(
"{$key} = {$value}<BR>\n");

function
RecurseXML($xml,&$vals,$parent="") {

$childs=0;
$child_count=-1; # Not realy needed.
$arr=array();
foreach (
$xml->children() as $key=>$value) {
if (
in_array($key,$arr)) {
$child_count++;
} else {
$child_count=0;
}
$arr[]=$key;
$k=($parent == "") ? "$key.$child_count" : "$parent.$key.$child_count";
$childs=RecurseXML($value,$vals,$k);
if (
$childs==0) {
$vals[$k]= (string)$value;
}
}

return
$childs;
}

?>
Output is like this:
type.0 = Lunch
time.0 = 12:30
menu.0.entree.0 = salad
menu.0.maincourse.0.part.0 = ships
menu.0.maincourse.0.part.1 = steak
menu.0.maincourse.0 =
menu.0.maincourse.1.part.0 = fisch
menu.0.maincourse.1.part.1 = rice
menu.0.maincourse.1 =
menu.0.maincourse.2.part.0 = wine
menu.0.maincourse.2.part.1 = cheese
menu.0.maincourse.2 =
menu.0 =

(Not beautiful, but it solved my case...)
up
0
boan dot web at outlook dot com
6 years ago
SimpleXMLElement::children can return null in this case:

<?php
$xml
= '
<root attr="Hello"/>
'
;

$sxe = new SimpleXMLElement($xml);

$sxe_xpath = $sxe->xpath('/root/@attr')[0];

$children = $sxe_xpath->children();

var_export($children); // Is null
?>
To Top