2012-01-02 3 views
1

J'ai un XML commeTrouver un nœud particulier à partir d'un document XML

<Person> 
    <firstName>pradeep</firstName> 
    <lastName>jain</lastName> 
    <address> 
    <doorNumber>287</doorNumber> 
    <street>2nd block</street> 
    <city>bangalore</city> 
    </address> 
    <phoneNums type="mobile">9980572765</phoneNums> 
    <phoneNums type="landline">080 42056434</phoneNums> 
    <phoneNums type="skype">123456</phoneNums> 
</Person> 

Je veux faire écho à la valeur de skype en utilisant php. Comment fait-on ça. J'ai écrit le code comme ci-dessous, mais sa ne fonctionne pas

<?php 
$doc = new DOMDocument(); 

if ($doc->load('new.xml')) 
{ 
    $userInfo = $doc->getElementsByTagName('Person'); 

    foreach($userInfo as $row) 
    { 
     $phoneInfo = $row->getElementsByTagName("phoneNums"); 

     foreach($phoneInfo as $row2) 
     { 
      // get the value from the first child 
      $work = $row2->getElementsByTagName("mobile")->item(0)->nodeValue; 
      $home = $row2->getElementsByTagName("landline")->item(0)->nodeValue; 
      echo $work; 
     } 
    } 
} 
?> 
+0

Quelle erreur obtenez-vous? À première vue je ne peux pas observer d'erreur. Avez-vous essayé par exemple, AVANT le premier foreach, un écho de count ($ userinfo)? Et si cela renvoie le bon nombre, alors immédiatement avant le second pour chaque écho de count ($ phoneInfo)? Pour avoir une idée du problème. – Soph

+0

@soph - j'obtiens une erreur comme Essayer d'obtenir la propriété de non-objet. J'obtiens le compte correctement. Je reçois cette erreur à la ligne $ work = $ row2-> getElementsByTagName ("mobile") -> item (0) -> nodeValue; – Hacker

+0

Ok, et si vous essayez de placer un 'echo count ($ phoneInfo)' juste avant le second foreach? Qu'est ce que tu obtiens?? (commenter la partie 'foreach' qui vient après) – Soph

Répondre

3

Désolé pour la réponse tardive. J'ai juste essayé ce code basé sur le XML que vous avez posté, avec la légère différence que j'ai supposé que votre XML contient de nombreux éléments de la balise Person. Il est beaucoup plus simple d'utiliser SimpleXML comme suggéré dans la question this.

<?php 
$xml = simplexml_load_file('path\to\doc.xml'); 
// With the following line you get all the Person tags 
$people = $xml->Person; 
foreach($people as $person) { 
    // For each person you get all the phoneNums tags 
    $phoneNumbers = $person->phoneNums; 
    foreach($phoneNumbers as $key => $value) { 
     $attributes = $value->attributes(); 
     // We get all of the attributes, and select the one on index 0 -the ONLY attribute in this given case 
     if ($attributes[0]=="skype") 
      echo $value; 
    } 
} 
?> 

Cela fonctionne pour un XML comme ceci:

<myXml> 
<Person> 
    <firstName>pradeep</firstName> 
    <lastName>jain</lastName> 
    <address> 
    <doorNumber>287</doorNumber> 
    <street>2nd block</street> 
    <city>bangalore</city> 
    </address> 
    <phoneNums type="mobile">9980572765</phoneNums> 
    <phoneNums type="landline">080 42056434</phoneNums> 
    <phoneNums type="skype">123456</phoneNums> 
</Person> 
<Person> 
    <firstName>pradeep</firstName> 
    <lastName>jain</lastName> 
    <address> 
    <doorNumber>287</doorNumber> 
    <street>2nd block</street> 
    <city>bangalore</city> 
    </address> 
    <phoneNums type="mobile">1</phoneNums> 
    <phoneNums type="landline">2</phoneNums> 
    <phoneNums type="skype">3</phoneNums> 
</Person> 
</myXml> 

Cependant, si vous voulez essayer avec votre XML d'origine (avec une seule étiquette de personne), cela fonctionne:

<?php 
// The following loads the ROOT into $xml (in your case, the Person tag is the root) 
$xml = simplexml_load_file('path\to\doc.xml'); 
// Then we get all its children (firstname, lastname, address, etc) 
$children = $xml->children(); 
// Of all its children, we select the phoneNums tags and then iterate 
$phoneNumbers = $children->phoneNums; 
foreach($phoneNumbers as $key => $value) { 
    $attributes = $value->attributes(); 
    // We get all of the attributes, and select the one on index 0 -the ONLY attribute in this given case 
    if ($attributes[0]=="skype") 
     echo $value; 
} 
?> 
+0

à l'intérieur de la deuxième boucle foreach n'imprime rien. Pouvez-vous vérifier le code une fois de plus. – Hacker

+0

@pradeep Je vous ai montré l'exemple XML avec lequel mon code a fonctionné. J'ai également ajouté le code si vous voulez qu'il fonctionne avec le code XML exact que vous avez posté. L'idée de simpleXML est que vous pouvez convertir du XML en un objet, et traiter ses éléments avec des sélecteurs de propriétés et des itérateurs normaux (vous pouvez en lire plus à ce sujet [ici] (http://php.net/manual/fr/book.simplexml .php)). :) – Soph

+0

qui a bien fonctionné. Mais je ne peux pas explicitement imprimer le numéro de Skype – Hacker

2

Essayez d'utiliser une requête XPath:

<?php 

$doc = new DOMDocument(); 

if ($doc->load('xpath.xml')) { 

    $xpath = new DOMXPath($doc); 
    $query = '/Person/phoneNums[@type="skype"]'; 
    $results = $xpath->query($query); 

    foreach ($results as $result){ // query may have more than one result 
     echo $result->nodeValue; 
    } 

} 

?> 
+0

- ceci fonctionne – Hacker

+0

@Hacker: Dans quel sens? – hakre

Questions connexes