php - How to iterate through an XML element node with dynamic children -
i have following xml structure:
<root> <maininfo> <node> <tournament_id>3100423</tournament_id> <games> <a_0> <id>23523636</id> <type> <choice_4> <choice_id>345</choice_id> <choice_4> <choice_9> <choice_id>345</choice_id> <choice_9> ... etc </type> </a_0> <a_1></a_1> <a_2></a_2> ...etc </games> </info> </node> </root> i can id of first node element "a_0" doing:
maininfo[0]->a_3130432[0]->games[0]->a_1[0]->id; my issue is: how automatically iterate (with foreach) through a_0, a_1, a_2 , values of each of these node elements , of children "345" in <choice_id>345</choice_id>?
the ending numbers of a_0, a_1 + children of choice_4, choice_9, dynamically created , there no logic in _[number] counting +1 each next element.
as has been outlined on stackoverflow (for example in read xml dynamic php) , in php manual (for example in basic simplexml usage), can iterate on child elements using foreach.
for example go on a_* elements, it's just
foreach ($xml->maininfo->node->games[0] $name => $a) { echo $name, "\n"; } output:
a_0 a_1 a_2 you want iterate on these ->type children again. is possible in pure php putting 1 foreach another:
foreach ($xml->maininfo->node->games[0] $name => $a) { echo $name, "\n"; if (!$a->type[0]) { continue; } foreach ($a->type[0] $name => $choice) { echo ' +- ', $name, "\n"; } } this outputs:
a_0 +- choice_4 +- choice_9 a_1 a_2 this starts bit complicated. can imagine since xml famous it's tree structures, you're not first 1 running problem. therefore query-language elements xml document has been invented: xpath.
with xpath can access xml data if file-system. know each a_* element child of games , each choice_* element child of type, it's pretty straight forward:
/*/maininfo/node/games/*/type/* ^ ^ ^ | | choice_* root | a_* in php simplexml looks like:
$choices = $xml->xpath('/*/maininfo/node/games/*/type/*'); foreach ($choices $choice) { echo $choice->getname(), ': ', $choice->choice_id, "\n"; } output:
choice_4: 345 choice_9: 345 as example shows, data retrieved single foreach.
if need access <a_*> elements, need have multiple foreach's or own iteration more advanced topic i'd extend on limits of question.
i hope helpful far. see simplexmlelement::children() gives children (like ->games[0] in first example). example codes available a working, interactive online-demo.
Comments
Post a Comment