2013-05-30 5 views
0

У меня есть небольшой скрипт, который я строю с помощью SimpleXML для синтаксического анализа небольшого XML-файла. У меня есть несколько сценариев, с которыми я использую SimpleXML, и у меня нет проблем, поэтому я использовал их раньше. Поэтому я не уверен, почему он не работает. Когда я делаю print_r ($ xml); для тестирования он выводит элементы, но я не могу заставить его анализировать данные в противном случае.SimpleXML ничего не возвращает

Это тестовый XML, который я использую.

XML FILE

Вот отрывок из SimpleXML

//Set path to data file 
$data = "http://www.mesquiteweather.net/xml/mesquite.xml"; 

// Lets parse the XML feed 
$xml = simplexml_load_file($data); 

//Set initial output to false 
    $tData = false; 
foreach($xml->entry as $entry){ 

    $fname = $entry->fname; 
    $lname = $entry->lname; 
    $location = $entry->location; 
    $report = $entry->report; 
    $description = $entry->description; 

Если кому-то нужен, чтобы увидеть весь сценарий здесь.

<?php 
####################################################################################### 
# 
# MESQUITE STORM REPORTS 
# version 1.00 
# 
# This program is free and no license is required. 
# 
# 
# mesquiteweather.net 
# 
####################################################################################### 

//// SETTINGS //// 


//// SETTINGS //// 

$bkgColor          = '#d4d4d4'; // Background color Examples: "gray" "#CCC" "#CCCCCC" 
$bc            = '#EEEEEE'; // Background color of table cells 
$dtColor          = '#FFF';  // Date & time color Examples: "#FC0" "#FFCC00" "white" 
$width           = '100%';  // Set the width of the report tables 

//// END OF SETTINGS //// 


####################################################################################### 

ini_set('display_errors','1'); 

## Start Configurable data ## 

//Set path to data file 
$data = "http://www.mesquiteweather.net/xml/mesquite.xml"; 

## End Configurable data ## 

// overrides from the Carter Lake Settings.php file (if applicable) 
global $SITE; 
if(isset($SITE['cacheFileDir'])) {$cacheFileDir = $SITE['cacheFileDir']; } 
if (isset($SITE['imagesDir'])) {$imagesDir = $SITE['imagesDir'];} 
if(isset ($SITE['tz']))   {$ourTZ = $SITE['tz'];} 
if(!function_exists('date_default_timezone_set')) 
{ 
    putenv("TZ=" . $ourTZ); 
} 
else 
{ 
    date_default_timezone_set("$ourTZ"); 
} 

// get path info & protect for cross-site scripting vulnerability 
$sri = ($_SERVER['REQUEST_URI']) ? str_replace('#SA', '', htmlspecialchars(strip_tags($_SERVER['REQUEST_URI']))) : ''; 

// set borders 
    $bbrdr = 'border-bottom:thin solid black';  // bottom 
    $lbrdr = 'border-left:thin solid black';   // left 
    $rbrdr = 'border-right:thin solid black';  // right 
    $tbrdr = 'border-top:thin solid black';   // top 
    $sbrdr = 'border-right:thin solid black; '. 
      'border-left:thin solid black';   // side 

//Define table to display after each storm report 
$afterTable = "<table style='margin-bottom: 5px;' border='0' cellpadding='0' cellspacing='0' width='100%'><tbody><tr><td><img alt='' src='images/1pixel.gif' border='0' height='7' width='7'></td><td class='shadow-mid' width='100%'><img alt='' src='images/1pixel.gif' border='0' height='7' width='7'></td><td><img alt='' src='images/1pixel.gif' border='0' height='7' width='7'></td></tr><tbody></table>\n"; 

// Let's assign the table some styles 
    $noMessageStyle        = "width:{$width}; text-align:center; margin:0px auto; background-color:{$bkgColor};"; 
    $td1Style         = "{$tbrdr};{$sbrdr}; padding:2px 0px 2px 6px; background-image:url({$imagesDir}headerbgd2.gif); color:{$dtColor};"; 
    $td2Style         = "{$sbrdr}; padding:6px 0px 0px 6px;"; 
    $td3Style         = "{$sbrdr}; line-height:5px;"; 
    $td4Style         = "{$sbrdr}; {$bbrdr}; padding: 2px 6px 6px 6px;"; 


//Set message to display if there were not report 
    $noStormMessage          .= "<table style='{$noMessageStyle}' cellpadding='0' cellspacing='0'>\n"; 
    $noStormMessage          .= "<tbody>\n"; 
    $noStormMessage          .= " <tr><td style='{$td1Style}'>LIVE STORM REPORTS</td></tr>\n"; 
    $noStormMessage          .= " <tr><td style='{$td4Style}'>There are currently no storm reports for Mesquite</td></tr>\n"; 
    $noStormMessage          .= "</tbody>\n"; 
    $noStormMessage          .= "</table>\n"; 
    $noStormMessage          .= $afterTable; 

// Lets parse the XML feed 
$xml = simplexml_load_file($data); 

//Set initial output to false 
    $tData = false; 
foreach($xml->entry as $entry){ 

    $fname = $entry->fname; 
    $lname = $entry->lname; 
    $location = $entry->location; 
    $report = $entry->report; 
    $description = $entry->description; 

// Set table style 
    $tableStyle = "width: 100%; margin:0px auto; background-color:{$bkgColor};"; 
    $td1Style = "{$tbrdr};{$sbrdr}; padding:2px 0px 2px 6px; background-image:url({$imagesDir}headerbgd2.gif); color:{$dtColor};"; 
    $td2Style = "{$sbrdr}; padding:6px 0px 0px 6px; background-color:{$reportColor};"; 
    $td3Style = "{$sbrdr}; line-height:5px; background-color:{$reportColor};"; 
    $td4Style = "{$sbrdr}; {$bbrdr}; padding: 2px 6px 6px 6px; background-color:{$reportColor};"; 


// construct data for table display 
    $tData .= "<table style='{$tableStyle}' cellpadding='0' cellspacing='0'>\n"; 
    $tData .= "<tbody>\n"; 
    $tData .= " <tr><td style='{$td1Style}'><b>{$report}</b></td></tr>\n"; 
    $tData .= " <tr>\n"; 
    $tData .= " <td style='{$td2Style}'>Reported By: <b>{$fname} {$lname}</b>&nbsp;&nbsp; - &nbsp;&nbsp;</b>Location: <b>{$location}</b></td>\n"; 
    $tData .= " </tr>\n"; 
    $tData .= " <tr><td style='{$td3Style}'>&nbsp;</td></tr>\n"; 
    $tData .= " <tr><td style='{$td4Style}'>Description: <b>{$description}</b></td></tr>\n"; 
    $tData .= "</tbody>\n"; 
    $tData .= "</table>\n"; 
    $tData .= $afterTable; 

} 

//If no storms were in the source, set no storm message 
if(!$tData) 
{ 
    $tData = $noStormMessage; 
} 

echo $tData; 

?> 

Я не уверен, что упускаю из виду или пропускаю. Я делал это много раз. Какие-либо предложения?

-Спасибо

+0

Можем ли мы увидеть результаты print_r? –

ответ

0

Проблема в том, entry не является элемент в вашем $xml объекта. Это корневой элемент. Таким образом, вы можете не нужен цикл:

$fname = $xml->fname; 
$lname = $xml->lname; 
$location = $xml->location; 
$report = $xml->report; 
$description = $xml->description; 

Вы могли бы рядом многочисленные entry элементы родительского элемента, то исходный код будет работать.

+0

Спасибо! Я добавил элемент, и теперь он отлично работает. – Texan78

0

Если файл XML, на который вы ссылаетесь, действительно является представителем полного файла, то ваша проблема находится здесь: $xml->entry.

SimpleXML не имеет отдельного объекта, представляющего документ, объект, который вы получаете при загрузке XML-строки или файла, является корневым элементом этого файла. Другими словами, $xmlявляется<entry> узел.

Так что вам просто нужно сказать $xml->fname, $xml->lname и т.д.

Файл XML может иметь только один «корневой элемент», так что не было бы никакой возможности для foreach ($xml->entry ... работать, если не было какой-то контейнер снаружи <entry> в входной файл.

Смежные вопросы