使用SimpleXML显示最新的XML提要条目

时间:2013-07-12 17:32:31

标签: php xml xml-parsing simplexml

我已经对此进行了搜索,但我没有找到我正在寻找的确切内容。我正在使用simpleXML来解析我所做的RSS提要,它非常适合只显示一个条目。我试图修改此方法只是拉最新更新的条目。我如何更新或仅提取最新条目?

这就是我现在解析RSS提要并只显示一个条目但是,这就是我被困的地方,因为我只想显示最近的条目。

这只是解析Feed的最相关代码的片段。

//Set initial output to false
    $tData = false;
for($i = 0; $i < 1; $i++){

    $location = $xml->reports[$i]->location;
    $upperCase = strtoupper($location);
    $report = $xml->reports[$i]->report;
    $timestamp = $xml->reports[$i]->timestamp;
    $updateTime = DATE("g:i A", STRTOTIME($timestamp));

// Set table style
   $tableStyle = "width: 100%; margin:0px auto; background-color:{$bkgColor};";
   $td1Style = "{$tbrdr};{$sbrdr}; text-align:center; font-size: 11px; background-image:url({$imagesDir}headerbgd2.gif); color:{$dtColor};";
   $td2Style = "{$sbrdr}; text-align:center; font-size: 12px; padding: 1px 0px 1px 0px; background-color:{$bkgColor};";
   $td3Style = "{$sbrdr}; {$bbrdr}; text-align:center; background-color:{$bc};";

 // construct data for table display
    $tData .= "<table style='{$tableStyle}' cellpadding='0' cellspacing='0'>\n";
    $tData .= "<tbody>\n";
    $tData .= "  <tr><td style='{$td1Style}'>LATEST LOCAL STORM REPORT</td></tr>\n";
    $tData .= "  <tr><td style='{$td2Style}'><b>{$report}</b>&nbsp;&nbsp; - &nbsp;&nbsp;<span style='color: rgb(204, 102, 0);'>{$upperCase} - {$updateTime}</span></td></tr>\n";
    $tData .= "  <tr><td style='{$td3Style}'><a href='wxmesqLSR.php' title='Click to view the details'>Click here for details</a></td></tr>\n";
    $tData .= "</tbody>\n";
    $tData .= "</table>\n";
    $tData .=  $afterTable;

 }

编辑: XML文件示例

<?xml version="1.0"?>
<entrys>
  <reports>
    <timestamp>Thu, 11 Jul 2013 23:19:39 -0500</timestamp>
    <name>Mesquite Weather</name>
    <location>Mesquite</location>
    <report>GENERAL</report>
    <description>Official MW test</description>
  </reports>
  <reports>
    <timestamp>Fri, 12 Jul 2013 00:44:39 -0500</timestamp>
    <name>Mesquite Weather</name>
    <location>Sunnyvale</location>
    <report>DOWNED POWER LINES</report>
    <description>Just an official MW test</description>
  </reports>
</entrys>

-Thanks!

2 个答案:

答案 0 :(得分:0)

您必须进行一些手动日期比较才能找到正确的条目,除非它们已经在xml中排序。所以基本上你的工作流程必须是:

  1. 遍历所有reports个节点并读取其时间戳
  2. 将时间戳转换为可比较的值(使用strtotimedate)并将它们全部比较以查找最新的reports
  3. 选择最近标识为reports的{​​{1}}并使用您现有的功能
  4. 如果它们按XML中的时间戳排序,则最近的条目将是第一个或最后一个。就你的例子而言,第一个不是你要找的那个,我怀疑它可能是最后一个。如果是这种情况,只需查找reports元素的数量(最简单的使用XPath count(//reports)(或类似),然后使用此索引读取reports元素。

答案 1 :(得分:0)

最新条目是转换为Unix时间戳时具有最高时间戳的条目。

在您当前的文件中,现在还不是这样。所以让我们创建一个这样的Unix时间戳数组:

$timestamps = array_map('strtotime', $xml->xpath('/*/reports/timestamp'));

为了能够对这些进行排序,还需要报告,因为它们应该被分类:

$reports    = $xml->xpath('/*/reports');

现在你有了一系列时间戳:

Array
(
    [0] => 1373602779
    [1] => 1373607879
)

一系列报告:

Array
(
    [0] => SimpleXMLElement Object
        (
            [timestamp] => Thu, 11 Jul 2013 23:19:39 -0500
            [name] => Mesquite Weather
            [location] => Mesquite
            [report] => GENERAL
            [description] => Official MW test
        )

    [1] => SimpleXMLElement Object
        (
            [timestamp] => Fri, 12 Jul 2013 00:44:39 -0500
            [name] => Mesquite Weather
            [location] => Sunnyvale
            [report] => DOWNED POWER LINES
            [description] => Just an official MW test
        )

)

基于另一个数组的值对一个数组进行排序已在下面列出:

同样的原则适用于simplexml中的场景,区别在于您需要先创建这些阵列 - 这就是我已经演示过的。

希望这对你有所帮助。排序simplexml的相关问题是: