php,xml,доставка UPS:«Невозможно просмотреть ввод XML с помощью XSL…» В чем ошибка?
-
20-08-2019 - |
Вопрос
Привет, я развертываю калькулятор доставки, используя эта функция, и я получаю эту ошибку только тогда, когда использую IE.Firefox прекрасно справляется с калькулятором доставки.Я не знаком с этой ошибкой, и поиск в Google говорит мне, что это проблема с форматом xml.Проблема в следующем:XML-ответ от сервера расчета доставки UPS не должен содержать такого содержания. Итак, мой вопрос:Как вы думаете, где ошибка?Я ценю ответы и предложения о том, где проверить. Я рисую пустоту.
Ошибка при использовании IE (vrs 8.7 и 6):
Страница XML не может быть отображена, не может просмотреть ввод XML с помощью листа стиля XSL.Пожалуйста, исправьте ошибку, а затем нажмите кнопку обновления, или попробуйте еще раз позже.
Неправильный синтаксис использовался в комментарии.Ресурс обработки ошибок '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> -->
Идеи?
Решение
Технически вы не можете использовать '--' внутри комментариев XML.Итак, вам следует изменить:
<!------------------- main content ------------------------->
к
<!-- main content -->
...или что-то подобное.Если UPS отправляет.Вы можете заменить его перед отправкой в браузер.
РЕДАКТИРОВАТЬ
Что касается отображения разметки, а не отображаемого HTML:Если вы видите то же самое, что и в Firefox (<RatingServiceSelectionResponse и т. д.), это не HTML, а XML.Вы либо захотите преобразовать его с помощью XSLT, либо использовать XPath (или XQuery и т. д.) для извлечения из него определенных значений.Похоже, вы также можете использовать функцию $myRate->getRate() из API ups-php, на который вы ссылались.
Другие советы
проблема заключалась в плохом форматировании HTML.Я удалил все свои комментарии, и по какой-то причине теперь он работает лучше.