Мой процессор API возвращает данные в одном из нескольких форматов, обозначенных ключевым словом «тип» в запросе. Я могу вызвать, например, заголовок JSON, используя следующий метод, но это не работает для XML. Есть ли способ вызвать это без ошибки?
<?PHP
if ($_REQUEST['type'] == "XML")
{
header ("Content-Type:text/xml");
}
В обозначении заголовка нет пробела. Позже я использую PHP-класс dom для формулировки XML. Это выглядит так
$dom = new DOMDocument("1.0", 'utf-8');
$root = $dom->createElement("Data");
$dom->appendChild($root);
if (!empty($Error))
{
$Er = $dom->createElement("Errors");
$root->appendChild($Er);
foreach($Error as $value)
{
$key = "Error";
$Child = $dom->createElement($key);
$Child = $Er->appendChild($Child);
$data = $dom->createTextNode($value);
$data = $Child->appendChild($data);
}
}
else
{
foreach($XMLItems as $key => $value)
{
$key = $dom->createElement($key);
$root->appendChild($key);
$variable = $dom->createTextNode($value);
$key->appendChild($variable);
}
}
$dom->preserveWhiteSpace = FALSE;
$dom->formatOutput = TRUE;
echo $dom->saveXML();
Решение: Что я сделал, чтобы решить проблему здесь, следуя предложениям Айнбера, так это удалил все пустые строки в PHP, а также любые включения. Я удалил закрывающие PHP-теги и лишние строки в этих включениях, а также в основном файле. Это устранило две пустые строки в верхней части файла, что позволило мне вставить заголовок XML.
@aynber Я добавил больше информации к моему вопросу выше.
А причина минуса в том. . .?
Вы можете, вы не можете. Дважды проверьте ответ от сервера, посмотрите, что именно он показывает в начале ответа.
В начале ответа обязательно есть две пустые строки. Не уверен, откуда они берутся. Ничего не записывается между началом файла и XML-процессом. Между ними происходит значительная обработка PHP. Нет пробела перед концом строки. Пустые строки, может быть?
Возможно пустые строки. Дважды проверьте наличие пустых строк или пустых/нулевых символов в верхней части файлов PHP перед <?php
и в любом месте, где вы можете выйти из него.
Что такое $XMLItems
?
XMLItems — это массив пар ключ-значение. Это содержимое XML.
Потерял время на редактирование последнего комментария. URL-адрес анализируется, результирующие переменные обрабатываются, они отправляются на мейнфрейм через API, результат обрабатывается дальше, и из результатов создается массив. Ответ возвращается в формате HTML, XML или JSON в зависимости от выбора запрашивающей стороны.
Проблема в том, что невозможно воспроизвести проблему без короткой репрезентативной выборки $XMLItems
.
$XMLItems = array('Variable_One'=>$VariableOne,'Variable_Two''=>$VariableTwo,'Variable_Three'=>$VariableThree.. и т. д.
Это бесполезно — вы только что передвинули стойки ворот, и теперь нам нужно знать, как выглядят $VariableOne
, $VariableTwo
и т. д. Помните, что вам нельзя помочь, если проблема не может быть воспроизведена в чьей-либо системе. Кроме того, внесите эти изменения в сам вопрос, а не в комментарии.
@aynber - пожалуйста, опубликуйте свои предложения в качестве решения этой проблемы.
"XML Parsing Error: XML or text declaration not at start of entity"
означает, что где-то в начале вашего вывода XML есть пробел или другой символ, которого там быть не должно. Есть несколько мест для проверки:
<?php
нет пробелов, новых строк или невидимых символов.
Ошибка возникает не из-за этого, а из возвращаемых вами данных. Клиент ожидает действительный XML, и, очевидно, то, что он возвращает, не начинается с фактического XML. Это может быть пробел или что-то еще недопустимое. Посмотрите на ответ, чтобы увидеть, что он возвращает.