Ошибка XML в амперсанде (&)
У меня есть php-файл, который печатает xml на основе базы данных MySQL.
Я каждый раз получаю ошибку именно в том месте, где есть & подпишите.
Вот некоторые php:
$query = mysql_query($sql);
$_xmlrows = '';
while ($row = mysql_fetch_array($query)) {
$_xmlrows .= xmlrowtemplate($row);
}
function xmlrowtemplate($dbrow){
return "<AD>
<CATEGORY>".$dbrow['category']."</CATEGORY>
</AD>
}
Вывод - это то, что я хочу, т.Е. Файл выводит правильную категорию, но все равно выдает ошибку.
Ошибка гласит: xmlparseentityref: нет имени
И затем он указывает на точный символ, который является & подпишите.
Это вызывает жалобы только в том случае, если $dbrow['category']
- это что-то с & войдите в него, например: "легковые и грузовые автомобили " или " компьютеры и телефоны".
Кто-нибудь знает, в чем проблема?
КСТАТИ: у меня во всех документах установлена кодировка UTF-8, а также вывод xml.
3 answers
&
в XML запускается сущность. Поскольку вы не определили сущность &WhateverIsAfterThat
, возникает ошибка. Вы должны избежать этого с помощью &
.
$string = str_replace('&', '&', $string);
Как избежать амперсандов в XML
Чтобы избежать других зарезервированных символов:
function xmlEscape($string) {
return str_replace(array('&', '<', '>', '\'', '"'), array('&', '<', '>', ''', '"'), $string);
}
Вам нужно либо превратить &
в его сущность &
, либо обернуть содержимое в теги CDATA.
Если вы выбираете маршрут сущности, есть дополнительные символы, которые вам нужно превратить в сущности:
> >
< <
' '
" "
Предыстория: Остерегайтесь амперсанда при использовании XML
Википедия: Список ссылок на сущности символов XML
public function sanitize(string $data) {
return str_replace('&', '&', $data);
}
Вы правы: здесь больше контекста - пример относится к "как обращаться с данными, содержащими "&", когда мы передаем эти данные в SimpleXML. Конечно, есть и другое решение для использования
<![CDATA[some stuff]]>