我正在使用SimpleXML构建一个小脚本来解析一个小的XML文件。我有几个脚本,我使用SimpleXML并没有问题所以我以前使用过它。所以我不确定为什么它不起作用。当我做print_r($ xml);测试它输出元素,但我不能让它解析数据否则。
这是我正在使用的测试XML。
以下是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> - </b>Location: <b>{$location}</b></td>\n";
$tData .= " </tr>\n";
$tData .= " <tr><td style='{$td3Style}'> </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;
?>
我不确定我错过了什么或忽略了什么。我做了很多次。有什么建议吗?
-Thanks
答案 0 :(得分:0)
问题是entry
不是$xml
对象中的元素。这是根元素。所以你不需要循环:
$fname = $xml->fname;
$lname = $xml->lname;
$location = $xml->location;
$report = $xml->report;
$description = $xml->description;
您可以接下来父元素中的多个entry
元素,然后您的原始代码将起作用。
答案 1 :(得分:0)
如果您链接的XML文件确实是完整文件的代表,那么您的问题就在这里:$xml->entry
。
SimpleXML没有表示文档的单独对象,加载XML字符串或文件时获得的对象是该文件的根元素。换句话说,$xml
是<entry>
节点。
所以你只需要说$xml->fname
,$xml->lname
等等。
XML文件只能有一个“根元素”,因此除非输入文件中有foreach ( $xml->entry ...
之外的某个容器,否则<entry>
无法工作。