循环遍历大型xml响应,然后将元素发送回另一个循环以进行响应

时间:2012-08-30 03:13:46

标签: php xml api

必须有更好的方法!这是我的代码:

checksession();
$restNew2 = new RESTConnector();


$urlNew2 = "https://localhost:9630/api/products/";
$restNew2->createRequest($urlNew2,"GET", null, $_SESSION['cookies'][0]);
$restNew2->sendRequest();


$responseNew2 = $restNew2->getResponse();
$xmlNew2 = new SimpleXMLElement($responseNew2);

foreach ($xmlNew2 as $purge){
    $id = (string)$purge->attributes()->id;

checksession();
$restNew = new RESTConnector();


$urlNew = "https://localhost:9630/api/products/".$id."/";
$restNew->createRequest($urlNew2,"GET", null, $_SESSION['cookies'][0]);
$restNew->sendRequest();


$responseNew = $restNew->getResponse();
$xmlNew[] = new SimpleXMLElement($responseNew);



}
$array = array();

foreach ($xmlNew as $purgeDet){
    $code[] = (string)$purgeDet->code;
    $classId[] = (string)$purgeDet->class['id'];
    for($i=0, $count = count($xmlNew); $i < $count; $i++) {
$array[$code[$i]]['classId'] = $classId[$i];
    }
}
print_r($array);

第一个响应给了我大约300,000行,所以我必须解析它以获取产品的ID以发送另一个请求来获得产品的完整渲染。它最终会发送40,000个请求。我希望晚上使用cron将其插入到mySQL数据库中,这样我就可以在第二天创建报告。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我是以大块的方式做的。进行第一次API调用并在其上循环,构建一个只有ID的列表并存储它。我将它们存储在一个文件中,每行1个...然后你可以逐行输出文件,而不是将整个数组加载到缓冲区中,或者你仍然可以将文件读取到数组中...无论哪个最终都是更好的解决方案

然后读取文件并遍历ID,进行详细调用并存储它们。

<强>更新

您还可以使用xpath查询继续抓取编译端的ID。

$xmlNew2->xpath("//THE_ELEMENT_WITH_THE_ID/@id");

但是我不知道如果这会为你节省很多,因为你仍然需要循环这个...它只是节省你必须在每个节点上调用SimpleXMLElement::attributes。但结果仍然是属性元素数组。