小弟最近在拿UPS的XML追踪信息学习,然后从国外的网站上找到一篇PHP XML的,然后测试后发现只能一条记录,无法体现所有的跟踪记录,还望有大神能指教如何显示出所有的跟踪记录,php 代码如下:<html>
<body></body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><?php 
error_reporting(0); 
class upstraking 
{
    function upstrack($trackingno,$account_data)
    {
        $trackingno='1Z2404976771067421';
        $data ="<?xml version=\"1.0\"?>
        <AccessRequest xml:lang='en-US'>
        <AccessLicenseNumber>".$account_data['access_lic_no']."</AccessLicenseNumber>
        <UserId>".$account_data['username']."</UserId>
        <Password>".$account_data['password']."</Password>
        </AccessRequest>
        <?xml version=\"1.0\"?>
        <TrackRequest>
        <Request>
<RequestOption>1</RequestOption> #0 is last status
        <TransactionReference>
        <CustomerContext>
        <InternalKey>blah</InternalKey>
        </CustomerContext>
        <XpciVersion>1.0</XpciVersion>
        </TransactionReference>
        <RequestAction>Track</RequestAction>
        </Request>
        <TrackingNumber>$trackingno</TrackingNumber>
        </TrackRequest>";
        $ch = curl_init("https://www.ups.com/ups.app/xml/Track");
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_POST,1);
        curl_setopt($ch,CURLOPT_TIMEOUT, 60);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
        $result=curl_exec ($ch);
         echo $result;
 //echo '<!-- '. $result. ' -->';
        $data = strstr($result,'<?'); 
        $xml_parser = xml_parser_create();
        xml_parse_into_struct($xml_parser, $data, $vals, $index);
        xml_parser_free($xml_parser);
        $params = array();
        $level = array();
        //print_r($vals);#die();
        foreach ($vals as $xml_elem) 
{
      if ($xml_elem['type'] == 'open') {
          if (array_key_exists('attributes',$xml_elem)) {
                   list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
            } else {
                  $level[$xml_elem['level']] = $xml_elem['tag'];
            }
      }
      if ($xml_elem['type'] == 'complete') {
           if(isset($xml_elem['value']) && $xml_elem['value'] != '') {
            $start_level = 1;
              $php_stmt = '$params';
               while($start_level < $xml_elem['level']) {
                 $php_stmt .= '[$level['.$start_level.']]';
                 $start_level++;

              }
                $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
               eval($php_stmt);
            }
    }
}
curl_close($ch);
#return $params;
print_r($params); // this array will return full information of tracking//die();
$table = "";
$table .= "<table class='pure-table pure-table-horizontal' border='1' height='100'>";
$table .= "<th>TRACKINGNUMBER</th>";
$table .= "<th>Date</th>";
$table .= "<th>Description</th>";
$table .= "<th>Address</th>";
//$table .= "<th>Signatory Name</th>";
//$table .= "<th>Event Type</th>";
$table .= "</tr>";if($params['TRACKRESPONSE']['RESPONSE']['RESPONSESTATUSDESCRIPTION']=='Success')
{
    $shipment=$params['TRACKRESPONSE']['SHIPMENT']; //
    $address_arr=$shipment['PACKAGE']['ACTIVITY']['ACTIVITYLOCATION']['ADDRESS'];
    $address=$address_arr['CITY'].','.$address_arr['COUNTRYCODE'];    $table .= "<tr>";
    $table .= "<td>".$shipment['PACKAGE']['TRACKINGNUMBER']."</td>";
    $table .= "<td>".$shipment['PACKAGE']['ACTIVITY']['DATE'] . "</td>";
    $table .= "<td>".$shipment['PACKAGE']['ACTIVITY']['STATUS']['STATUSTYPE']['DESCRIPTION'] . "</td>";
    $table .= "<td>".$address."</td>";    $table .= "</tr>"; }
$table .= "</table>";echo $table;
    }
}
$obj_upstraking = new upstraking();
$account_data = array();
$account_data['access_lic_no']='8BEFB9015E0D2859';
$account_data['username']='marcrosoft';
$account_data['password']='ddqpou87';
$obj_upstraking->upstrack($trackingno='1Z2404976771067421',$account_data);?>

解决方案 »

  1.   

    跟踪记录共有23条(倒序排列),你的程序只输出了第一条
    这是对的,因为在物流中只有最新的一条是最有价值的你把 46 行的 echo $result;
    改成
    $xml = simplexml_load_string ($result);
    print_r($xml);
    就可看到全部的记录了你的程序太陈旧了,利用 simplexml_load_string 的结果进行输出要简便的多
      

  2.   

    十分感谢你的回复,但是下面的动态表格如何抓取$result中的所有扫描记录呢?$params只抓取的一条,还望老师赐教,再次感谢