2011-10-30 6 views
0

Je ne peux pas sembler analyser mon xml aujourd'hui. Qu'est ce que j'ai mal fait? J'espère que quelqu'un peut me diriger vers une meilleure solution/travail.php DOM xml analyse syntaxique geon awry

Je veux analyser un fichier xml ligne de bus qui ressemble à ceci:

<buses> 
<bus> 
<num>12</num> 
<stime>05:00</stime> 
<etime>22:00</etime> 
<freq>?</freq> 
<route> 
    <stop>Eonyang Bus Terminal</stop> 
    <stop>Chuk Hyub</stop> 
    <stop>Eonyang Bolim Hospital</stop> 
    <stop>Samnammyeong Residential Center</stop> 
    <stop>SinAn</stop> 
</route> 
</bus> 
<bus> 
<num>13</num> 
<stime>?</stime> 
<etime>?</etime> 
<freq>?</freq> 
<route> 
    <stop>KTX Ulsan Station</stop> 
    <stop>Driving Hagwon</stop> 
    <stop>Jayeon Science High School</stop> 
    <stop>Eonyang Bus Stop</stop> 
    <stop>Bolim Hospital</stop> 
    <stop>Daewon Green Apt.</stop> 
</route> 

Basé sur l'entrée d'utilisateur d'origine et de destination, je veux chercher dans la liste des arrêts pour trouver le bus ou les bus désirés, mais simplement analyser cette liste ne fonctionne pas.

<?php 

$xmlDoc = new DOMDocument(); 
$xmlDoc->load("buses-new.xml"); 

$buses=$xmlDoc->getElementsByTagName('bus'); 


for($i=0; $i<($buses->length); $i++) { 

    $route=$buses->item($i)->getElementsByTagName('route'); 
    $busnum=$buses->item($i)->getElementsByTagName('num'); 


    foreach($route->childNodes as $stop) { 

     $loc = $stop->nodeValue; 

    if (stristr($loc,$orig)) { 
     // found a bus with origin 
    $origins[$ocount]= $i; 
    $ocount++; 
    } 

    if (stristr($loc,$dest)) { 
    // found a bus with destination 
    $destination[$dcount] = $i; 
    $dcount++; 
    } 


    } // for all stops 

} // for all buses 

Je reçois une erreur ---- foreach ($ route-> childNodes comme $ stop) - dit en argument non valide. Quelle est la bonne façon d'analyser une liste indéterminée de childnodes de chaque route?

Répondre

0

Vous devez faire une des opérations suivantes:

Si vous savez qu'il n'y a qu'un seul élément de la route dans un élément de bus:

changement

$route=$buses->item($i)->getElementsByTagName('route'); 

à

$route=$buses->item($i)->getElementsByTagName('route')->item(0); 

S'il peut y avoir plusieurs éléments d'itinéraire, vous devez répéter:

$routes = $buses->item($i)->getElementsByTagName('route'); 
foreach($routes as $route) 
{ 
    foreach($route->childNodes as $stop) { 
    ... 
} 
+0

merci, cela fonctionne. – Martin

0

$ route est une DOMNodeList. Vous voulez:

$route=$buses->item($i)->getElementsByTagName('route')->item(0); 

n'est-il pas plus agréable d'itérer avec foreach?

foreach($buses as $bus) { 
    $route = $bus->getElementsByTagName('route')->item(0); 
    $busnum = $bus->getElementsByTagName('num')->item(0); 
} 
+0

sur les bus, je veux la position de l'élément dans la liste - je vais devoir passer par ce sous-ensemble pour trouver des destinations communes lorsqu'un bus ne passe pas du point A au point B mais un point commun C est un arrêt pour deux bus. – Martin

+0

Ah je vois. Il semble encore plus agréable de faire foreach et juste utiliser $ position ++ – pguardiario