2009-07-16 8 views
2

Hé les gars, je veux analyser un peu de xml mais je ne sais pas comment je peux obtenir les mêmes balises sur 1 élément.SimpleXML plus de tags dans 1 élément

Je veux analyser ceci:

<profile> 
    <name>john</name> 
    <lang>english</lang> 
    <lang>dutch</lang> 
</profile> 

Je veux analyser les langues que John parle. Comment puis je faire ça ?

Répondre

2

Vous pouvez exécuter une boucle foreach sur le nœud d'élément après avoir tiré dans avec SimpleXML comme ceci:

$xml_profiles = simplexml_load_file($file_profiles); 

foreach($xml_profiles->profile as $profile) 
{ //-- first foreach pulls out each profile node 

    foreach($profile->lang as $lang_spoken) 
    { //-- will pull out each lang node into a variable called $lang_spoken 
     echo $lang_spoken; 
    } 
} 

Ceci a l'avantage d'être en mesure de traiter un certain nombre de lang éléments vous pouvez avoir ou ne pas avoir pour chaque élément de profil.

2
$profile->lang[0] 
$profile->lang[1] 
1

Pensez à des nœuds XML en double comme se comportant comme un tableau.

Comme d'autres ont souligné, vous pouvez accéder aux nœuds enfants avec la syntaxe de support

myXML->childNode[childIndex] 

Comme une note de côté voici comment les flux RSS travail. Vous noterez plusieurs

<item> 
</item> 

<item> 
</item> 

<item> 
</item> 

Tags dans un tag de RSS XML. Les lecteurs RSS traitent ce problème tous les jours en traitant la liste comme un tableau d'éléments.

Qui peut être bouclé.

0

Vous pouvez également utiliser XPath pour recueillir un ensemble d'éléments spécifiques comme

$xProfile = simplexml_load_string("<profile>...</profile>"); 
$sName = 'john'; 
$aLang = $xProfile->xpath("/profile/name[text()='".$sName."']/lang"); 
// Now $aLang will be an array of lang *nodes* (2 for John). Because they 
// are nodes you can still do SimpleXML "stuff" with them i.e. 
// $aLang[0]->attributes(); --which is an empty object 
// or even 

$sPerson = (string)$aLang[0]->xpath('preceding-sibling::name'); 
// of course you already know this... but this was just to show what you can do 
// with the SimpleXml node. 
Questions connexes