使用SimpleXML读取多个URL并组织数据

问题描述:

我实际上是PHP的新手 - 我刚刚开始学习,以便将我的网站与API集成。到目前为止,它已经很好了,但是我一直无法找到与我的问题有关的信息。使用SimpleXML读取多个URL并组织数据

目标:使用外部API来拉取“订单”,“产品”和“包”。在此之后,允许导出登录用户的订单列表(过去和活动)以及所有重要信息。

什么工作:它拉动信息并发布。

什么不是:API使用“分页”,我无法超越该限制。举例来说,目前有22个订单。如果我打电话给API,它会发送前10个,他们完美地输出。为了获得更多,我可以追加“per_page”和“page =#”到最后。但我只能手动执行此操作。例如,如果我使用“per_page = 20”来硬编码地址,它将显示全部20.但问题是我不会总是知道要拉多少,如果我试图拉23(超过1),它只是错误并且根本不加载任何东西。

为了表明我目前使用的代码(它被大大缩短,显示的重要组成部分):

<?php 
$packages = 'http://[email protected]/packages.xml'; 
$products = 'http://[email protected]/products.xml'; 
$orders = 'http://[email protected]/orders.xml'; 

$packagelist = new SimpleXMLElement($packages,null,true); 
$productlist = new SimpleXMLElement($products,null,true); 
$orderslist = new SimpleXMLElement($orders,null,true); 

foreach($productlist->children() as $child) { 
    echo $child->getName().": 
"; 

    foreach($child->children() as $subchild) { 
    echo "<br />--->".$subchild->getName().": ".$subchild." 
"; 
    } 
} 


foreach($orderslist->children() as $child) { 
    echo $child->getName().": 
"; 

    foreach($child->children() as $subchild) { 
    echo "<br />--->".$subchild->getName().": ".$subchild." 
"; 
    } 
} 
?> 

伴随着这一点,我很好奇,如果我的迭代方法是有效的。实际情况是,我使用以下内容(它设置为阅读订单列表,并将网站的电子邮件地址和名称与列表进行比较,如果它命中,它将采用购买ID号并解析包和产品列表以提取名称在购买的):

foreach($orderslist as $child) { 
    $purchaser = $child->{'buyer-name'}; 
    $email_addy = $child->{'buyer-email'}; 
    $download_url = $child->{'download-url'}; 
    $valid = $child->{'valid-until'}; 
    $expires = date("F j, Y", strtotime("$valid")); 
    $product_id = $child->{'product-id'}; 
    $package_id = $child->{'package-id'}; 
    if ($email_addy == "$activeEmail" && $purchaser == "$usersName" && ($child->state == "complete" || $child->state == "free")){ 
     foreach($productlist as $testing){ 
      if ($product_id == "{$testing->id}"){ 
    echo "<tr><td>{$testing->name}</td> <td><a href=\"$download_url\">Download</a></td> <td>$expires<br /></td></tr>"; 
    } 
} 

最后一个问题我与设置就是为系统中得到更多的购买,正在读列表会越来越长。实际上,每当有人访问他们的账户页面时,它都会在列表中获取最新的信息。有没有更有效的方法来处理这个问题?

API文档:http://www.digitaldeliveryapp.com/developers/api/introduction

提前感谢!正如你所看到的,我对此非常陌生,但迄今为止这已经是一次很好的学习体验!

您使用Simplexml作为解析器,因为您已经提到顺序列表可以快速增长所以我认为您可以更好地使用domdocument,因为这不会加载整个xml在内存中。 我也将订单保存在数据库中,只请求从API获取新订单。因此,您也可以查询您自己的数据库,仅查找该客户的订单。

+0

我正在考虑使用数据库查询,但有点担心旧命令的更改会被错过 - 例如,如果有人做了退单,系统仍然会显示它在X日期之前处于活动状态,请显示下载链接等等,尽管它不是。 – Bryan 2012-01-03 09:18:16

+0

在阅读完DomDocument之后,我认为它会起作用,但是我怎么去拉取所有需要的URL(url?per_page = 50 && page = 1,page = 2,page = 3等,直到所有的都被拉出来)? – Bryan 2012-01-03 09:27:07

+0

这是真的,但对你我希望api提供的修改日期。对于分页,我想你需要发送反馈给他们,因为当你重写分页参数来获取50并且你有56个命令时他们必须向你显示页面上的最后6个到 – 2012-01-03 11:09:51