【问题标题】:How to to sort a XML feed with SimpleXML如何使用 SimpleXML 对 XML 提要进行排序
【发布时间】:2009-11-25 16:09:24
【问题描述】:

我已经开始使用 simplexml 函数,它似乎比我之前尝试使用的其他解析器效果更好。我已经到了需要对项目进行分类的阶段 按传输日期 - 我尝试使用 uasort,但没有对项目的顺序进行任何更改。

有时一个节目在同一天播放不止一次 - 按视频 ID 排序会更容易吗?

这是对象的样子:

[0] => SimpleXMLElement Object
    (
        [VideoID] => 108059
        [Genre] => Music
        [ProgrammeName] => MTV
        [OriginalAiringDate] => 2009-11-10T19:22:24
        [TransmissionDate] => 2009-11-10T19:22:24
   )
[1] => SimpleXMLElement Object
    (
        [VideoID] => 108395
        [ExpiryDate] => 2009-12-12T23:59:59
        [DateCreated] => 2009-11-12T13:28:54
        [Genre] => Music
        [ProgrammeName] => MTV
        [OriginalAiringDate] => 2009-11-12T19:22:32
        [TransmissionDate] => 2009-11-12T19:22:32
 )

$xml = simplexml_load_file("data.xml");
$count = 0;
$sortItem = 0;
$dateformat = "D j M, g:ia";
$sortArray = array();
foreach($xml->CatchUp as $item){
$sortArray[$count][TransmissionDate] = $item;
if($count < 4){
print "<p>Programme Name:<strong> "  . $item->ProgrammeName. "</strong></p>";
print "<p>Date Shown:<strong> "  . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>";
print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>";
print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>";
         $count++;
  }
}

}

asort($sortArray);

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    我看到了两种方法。首先是创建一个包含TransmissionDate 值的数组,然后是另一个包含相应节点的数组,然后使用array_multisort()。这有点乏味,所以我会这样做:下载SimpleDOM并使用sortedXPath()

    include 'SimpleDOM.php';
    
    $xml = simpledom_load_file("data.xml");
    $dateformat = "D j M, g:ia";
    
    foreach($xml->sortedXPath('CatchUp[ProgrammeName="MTV"]', 'TransmissionDate') as $i => $item)
    {
        if ($i == 4)
        {
            // I assume you only want the first 4
            break;
        }
        print "<p>Programme Name:<strong> "  . $item->ProgrammeName. "</strong></p>";
        print "<p>Date Shown:<strong> "  . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>";
        print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>";
        print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>";
    }
    

    【讨论】:

    • Great Josh 它可以工作,一个小问题,如果我想按名称过滤,例如只显示前 4 个 MTV 节目。就像 if($item->Programme == "MTV"){ } 它似乎坏了
    • 第一个参数是一个 XPath 表达式。 CatchUp 表示“所有名为 CatchUp 的子节点” - 您可以添加一个谓词,例如:CatchUp[ProgrammeName="MTV"] 将其转换为“所有名为 CatchUp 的子节点都有一个名为 ProgrammeName 的子节点,其值为 @ 987654332@" - 见w3schools.com/XPath/xpath_syntax.asp
    • 谈到 XPath,我还应该提到,您可以使用它通过添加谓词 [position() &lt;= 4] 将搜索限制在前 N 项,从而无需在 PHP 中使用计数器。我没有提到它是为了让初学者保持简单,但是任何必须操作 XML 的人都应该好好看看 XPath,因为它真的很强大,而且一旦你学习了基础知识,它实际上很容易。
    • 似乎每次我通过拉取特定节目来过滤数据时,排序机制都不起作用 - XPath 中有没有一种方法可以指定排序顺序,因为它现在正在显示内容以相反的顺序。
    • 让你的 data.xml 在某处可用,我会看看它。如果这是 SimpleDOM 中的错误,请在 Google Code 中提交错误。
    【解决方案2】:

    在从 SimpleXMLElement 对象中提取数据时尝试使用强制转换

    使用视频 ID: $sortArray[$count][VideoID] = (int)$item;

    【讨论】:

    • 感谢 cedko80,它实际上并没有工作顺序保持不变 foreach($xml-&gt;CatchUp as $item){ $sortArray[$count]['VideoID'] = ( int)$项目; if($count
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多