代码之家  ›  专栏  ›  技术社区  ›  montooner

php、xml、ups shipping:“无法使用xsl查看XML输入…”错误在哪里?

  •  1
  • montooner  · 技术社区  · 15 年前

    嘿,所以我要用 this function 只有当我使用IE的时候,我才会得到这个错误。火狐用运费计算器做的很好。我不熟悉这个错误,谷歌搜索告诉我这是XML格式的问题。问题是:来自UPS发货计算服务器的XML响应不应该包含此内容。 所以,我的问题是:你认为这个bug在哪里?我很感谢你对检查地点的回答和建议。 我正在画一个空白。

    使用IE(VRS 8)时出错。7和6):

    无法显示XML页 无法使用XSL样式查看XML输入 薄板。请更正错误并 然后单击刷新按钮,或尝试 以后再说。


    a中使用了不正确的语法 评论。处理资源时出错 ’ http://mgxvideo.com/mgxcopy-alpha-3/shopping/cart_displa

    <!------------------- main content ------------------------->
    

    ------^

    从服务器请求的PHP代码部分:

    $ch = curl_init("https://www.ups.com/ups.app/xml/Rate");
            curl_setopt($ch, CURLOPT_HEADER, 1);
            curl_setopt($ch,CURLOPT_POST,1);
            curl_setopt($ch,CURLOPT_TIMEOUT, 90);
            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. ' -->'; // THIS LINE IS FOR DEBUG PURPOSES ONLY-IT WILL SHOW IN HTML COMMENTS
            $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();
            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') {
            $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);
            #print_r($params);
            #echo "<br/><br/>";
            return $params['RATINGSERVICESELECTIONRESPONSE']['RATEDSHIPMENT']['TOTALCHARGES']['MONETARYVALUE'];
    

    下面是firefox对XML请求的响应(在上面的代码中,这一行表示“这一行仅用于调试目的”):

    <!-- HTTP/1.1 100 Continue
    
    HTTP/1.1 200 OK
    Date: Fri, 26 Jun 2009 21:58:04 GMT
    Server: Apache
    Pragma: no-cache
    Content-Length: 1524
    Content-Type: application/xml
    
    <?xml version="1.0"?><RatingServiceSelectionResponse><Response><TransactionReference><CustomerContext>Bare Bones Rate Request</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>1</ResponseStatusCode><ResponseStatusDescription>Success</ResponseStatusDescription></Response><RatedShipment><Service><Code>02</Code></Service><RatedShipmentWarning>Your invoice may vary from the displayed reference rates</RatedShipmentWarning><BillingWeight><UnitOfMeasurement><Code>LBS</Code></UnitOfMeasurement><Weight>6.0</Weight></BillingWeight><TransportationCharges><CurrencyCode>USD</CurrencyCode><MonetaryValue>14.34</MonetaryValue></TransportationCharges><ServiceOptionsCharges><CurrencyCode>USD</CurrencyCode><MonetaryValue>0.00</MonetaryValue></ServiceOptionsCharges><TotalCharges><CurrencyCode>USD</CurrencyCode><MonetaryValue>14.34</MonetaryValue></TotalCharges><GuaranteedDaysToDelivery>2</GuaranteedDaysToDelivery><ScheduledDeliveryTime></ScheduledDeliveryTime><RatedPackage><TransportationCharges><CurrencyCode>USD</CurrencyCode><MonetaryValue>14.34</MonetaryValue></TransportationCharges><ServiceOptionsCharges><CurrencyCode>USD</CurrencyCode><MonetaryValue>0.00</MonetaryValue></ServiceOptionsCharges><TotalCharges><CurrencyCode>USD</CurrencyCode><MonetaryValue>14.34</MonetaryValue></TotalCharges><Weight>6.0</Weight><BillingWeight><UnitOfMeasurement><Code>LBS</Code></UnitOfMeasurement><Weight>6.0</Weight></BillingWeight></RatedPackage></RatedShipment></RatingServiceSelectionResponse> -->
    

    思想?

    2 回复  |  直到 15 年前
        1
  •  4
  •   steamer25    15 年前

    从技术上讲,在XML注释中不能有“--”。所以你应该改变:

    <!------------------- main content ------------------------->
    

    <!--                  main content                     -->
    

    …或者类似的东西。如果UPS正在发送。您可以在将其转发到浏览器之前替换它。

    编辑

    关于显示标记而不是呈现的HTML:如果您看到的内容与Firefox中的内容相同(<RatingServiceSelectionResponse等),那么这不是HTML,而是XML。您要么希望用XSLT转换它,要么使用xpath(或xquery等)从中提取特定的值。看起来您还可以使用您引用的ups php api中的$myrate->getrate()函数。

        2
  •  1
  •   montooner    15 年前

    问题是HTML格式不好。我删除了所有评论,出于某种原因,它现在工作得更好了。