SimpleXMLElement::children

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::childrenНаходит дочерние элементы данного узла

Описание

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

Этот метод находит все дочерние элементы узла. Результат подчиняется стандартным правилам итерации.

Замечание: SimpleXML содержит правило добавления итеративных свойств к большинству методов. Они не могут быть просмотрены с использованием var_dump() или каких-либо других средств анализа объектов.

Список параметров

namespaceOrPrefix

Необязательное пространство имён XML.

isPrefix

Если isPrefix установлен в true, namespaceOrPrefix будет рассмотрен как префикс. Если false, namespaceOrPrefix будет рассмотрен как пространство имён URL.

Возвращаемые значения

Возвращает элемент SimpleXMLElement, даже если узел не имеет дочерних элементов, если узел не представляет атрибут, в этом случае функция возвращает null.

Примеры

Пример #1 Обход псевдомассива children()

<?php
$xml
= new SimpleXMLElement(
'<person>
<child role="сын">
<child role="дочь"/>
</child>
<child role="дочь">
<child role="сын">
<child role="сын"/>
</child>
</child>
</person>'
);

foreach (
$xml->children() as $second_gen) {
echo
' У человека родился(-ась) ' . $second_gen['role'];

foreach (
$second_gen->children() as $third_gen) {
echo
', у которого родился(-ась) ' . $third_gen['role'] . ';';

foreach (
$third_gen->children() as $fourth_gen) {
echo
' и у ' . $third_gen['role'] .
' родился(-ась) ' . $fourth_gen['role'];
}
}
}
?>

Результат выполнения приведённого примера:

У человека родился(-ась) сын, у которого родился(-ась) дочь; У человека
родился(-ась) дочь, у которого родился(-ась) сын; и у сын родился(-ась) сын

Пример #2 Использование пространства имён

<?php
$xml
= '<example xmlns:foo="my.foo.urn">
<foo:a>Яблоко</foo:a>
<foo:b>Банан</foo:b>
<c>Вишня</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)

Смотрите также

  • SimpleXMLElement::count() - Подсчитывает количество дочерних элементов у текущего элемента
  • count() - Подсчитывает количество элементов в массиве или в объекте Countable

Добавить

Примечания пользователей 4 notes

up
13
aero
17 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
16 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
5 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