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

时间:2012-01-03 08:37:39

标签: php xml simplexml

我实际上是PHP新手 - 我最近才开始学习,以便将我的网站与API集成。到目前为止它已经很顺利了,但是我一直无法找到与我的问题相关的信息。

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

什么有效:它会提取信息并发布信息。

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

显示我目前使用的代码(显着缩短以显示重要部分):

<?php
$packages = 'http://MYKEY@api.digitaldeliveryapp.com/packages.xml';
$products = 'http://MYKEY@api.digitaldeliveryapp.com/products.xml';
$orders = 'http://MYKEY@api.digitaldeliveryapp.com/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

提前致谢!正如你所看到的,我对此非常陌生,但到目前为止这是一次很棒的学习经历!

1 个答案:

答案 0 :(得分:0)

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