Подсчет записей в файле XML - PullRequest
1 голос
/ 09 сентября 2011

Есть ли способ подсчитать, сколько записей содержится в данном XML-файле?

Пример: http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/rackemup420/cars?output=xml

Мой код:

// The POST URL and parameters      
$request =  'http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/'.$u.'/cars?output=xml';      

// Get the curl session object      
$session = curl_init($request);      

// Set the POST options.  
curl_setopt($session, CURLOPT_HEADER, true);      
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);      

// Do the POST and then close the session      
$response = curl_exec($session);      
curl_close($session);      

// Get HTTP Status code from the response      
$status_code = array();      
preg_match('/\d\d\d/', $response, $status_code);      

// Check for errors      
switch( $status_code[0] ) {      
    case 200:      
        // Success      
        break;      
    case 503:      
        die('Service unavailable. An internal problem prevented us from returning data to you.');      
        break;      
    case 403:      
        die('Forbidden. You do not have permission to access this resource, or are over your rate limit.');      
        break;      
    case 400:      
        // You may want to fall through here and read the specific XML error      
        die('Bad request. The parameters passed to the service did not match as expected. The exact error is returned in the XML response.');      
        break;      
    default:      
        die('Your call returned an unexpected HTTP status of:' . $status_code[0]);      
}      

// Get the XML from the response, bypassing the header      
if (!($xml = strstr($response, '<?xml'))) {      
    $xml = null;      
}      

// Output the XML      

$worldCar = simplexml_load_string($xml);     
foreach ($worldCar->worldCar as $cars)        
{    

    $playercarid = $cars['carId'];      
    $playercarmake = $cars['make'];      
    $playercarname = $cars['carName'];   

        $playercaraccel = $cars->physicsProfile['acceleration'];      
        $playercarhandle = $cars->physicsProfile['handling'];      
        $playercarrating = $cars->physicsProfile['rating'];  
        $playercarspeed = $cars->physicsProfile['topSpeed'];  
        $playercartier = $cars->physicsProfile['tier'];  
}  

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Для подсчета

count( $worldCar->xpath('worldCar') );

Зацикливание (это ваша проблема, вы получаете только первый WorldCar)

foreach ($worldCar->xpath('worldCar') as $node)
{
  ...
}

Или

foreach ($worldCar->children() as $node)
{
  ..
}
0 голосов
/ 09 сентября 2011

Я думаю, что вам нужно сначала загрузить файл: посмотрите руководство PHP для записи о загрузке файлов XML Здесь

Затем, как только вы загрузите документ в память, я вам верюиспользуйте объект «XMLReader» для обхода узлов и увеличивайте независимую переменную счетчика по мере продвижения.

Я полагаю, В этой статье обсуждается операция чтения и продвижения к следующему узлу.Несмотря на то, что вы читаете комментарии в нижней части этой статьи, если у вас очень большой XML-файл, вам может не хватить памяти.Позаботьтесь, чтобы вы не пытались разобрать файл размером 1 Тб или что-то в этом роде ... :)

Удачи!

H

Редактировать: Похоже, вы можете использоватьОбъект XMLReader для открытия файла, который вы хотите прочитать, а также для целей этой публикации, вы можете использовать XMLReader-> next ();

Простой пример кода может выглядеть следующим образом:

$nodeCount = 1;
$xr = XMLReader::open("myxmlfile.xml"); //Called staticly, returns an XMLReader object or false!
if(xr != false) // Check to see if its a valid object
{
   while($xr->next() == true) //Iterate through all the nodes
   {
      $nodeCount++; //increment an accumulator
   }
}
echo "$nodeCount nodes were found!"; 
...