Объявление сущности в сгенерированном php XML-документе (и т. Д.) - PullRequest
3 голосов
/ 12 мая 2011

Это сводит меня с ума, много подобных проблем в Интернете, но я не могу найти правильное решение.

Я создаю XML-документ на PHP, который будет отправлен в ответ назапрос ajax.Ответ будет выглядеть примерно так:

<?xml version="1.0" encoding="iso-8859-1"?>
<response>
  <status>success</status>
  <message>&nbsp;&mdash;</message>
</response>

Тег будет содержать более значимую информацию, чем эта, но именно такие объекты, как те, которые вызывают у меня проблему.

Код php, которыйгенерирует, что xml ниже:

header("Content-Type: text/xml");

$dom = new DOMDocument('1.0', 'iso-8859-1');
$dom->formatOutput = true;

$response_node = $dom->createElement("response");
$dom->appendChild($response_node);
$response_node->appendChild($dom->createElement('status', 'success'));
$response_node->appendChild($dom->createElement('message', "&nbsp;&mdash"));
echo $dom->saveXML();
return;

Показанный выше xml успешно возвращается в функцию javascript, которая выполняла вызов, но когда он пытается проанализировать документ xml, он терпит неудачу.

Если я пытаюсь проверить xml, используя этот валидатор , я получаю следующую ошибку:

Эта страница содержит следующие ошибки:

ошибка в строке 5 в столбце15: Сущность 'nbsp' не определена

Сущность &mdash; вызывает ту же проблему.

Думаю, мне нужно найти способ поместить что-то подобное в xml:

<!ENTITY name "entity_value">

Я не уверен, как это сделать, или если это правильный путь.Разве я не правильный путь?Если да, то как мне это сделать?Если нет, как правильно решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 12 мая 2011

Это один из способов решения проблемы, добавьте объявление типа документа, которое определяет сущности:

$dom = new DOMDocument('1.0', 'iso-8859-1');
$dom->formatOutput = true;
$doctype = DOMImplementation::createDocumentType("html","-//W3C//DTD XHTML 1.1//EN","http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd");
$dom->appendChild($doctype);

$response_node = $dom->createElement("response");
$dom->appendChild($response_node);
$response_node->appendChild($dom->createElement('status', 'success'));
$response_node->appendChild($dom->createElement('message', "&nbsp;&mdash"));
echo $dom->saveXML();
return;
2 голосов
/ 12 мая 2011

Имена сущностей HTML недопустимы в XML без определения их с помощью <!ENTITY name "...">, как вы указали. Но числовые сущности сделают свое дело.

Попробуйте заменить:

&nbsp; => &#xA0;

&mdash; => &#x2014;

1 голос
/ 14 января 2014

- и неразрывный пробел - это абсолютно допустимые символы UTF-8, разрешенные в XML.

Если ваше исходное сообщение содержит его и было преобразовано в объект, который будет отображаться в вашем XML, укажите, что вы хотитедля преобразования символов в XML, а не в HTML:

PHP 5.4.0 +:

$encoded_value = htmlentities($value, ENT_COMPAT | ENT_XML1);

В более старых версиях PHP кодировкой по умолчанию является ISO-8859-1, поэтому укажите UTF-8 в кодировке:

$encoded_value = htmlentities($value, ENT_COMPAT | ENT_XML1, 'UTF-8');

Примечание: вы можете использовать функцию html_entity_decode для получения объекта mdash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...