Ошибка 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.

Author: simhumileco, 2010-10-26

3 answers

& в XML запускается сущность. Поскольку вы не определили сущность &WhateverIsAfterThat, возникает ошибка. Вы должны избежать этого с помощью &amp;.

$string = str_replace('&', '&amp;', $string);

Как избежать амперсандов в XML

Чтобы избежать других зарезервированных символов:

function xmlEscape($string) {
    return str_replace(array('&', '<', '>', '\'', '"'), array('&amp;', '&lt;', '&gt;', '&apos;', '&quot;'), $string);
}
 36
Author: NikiC, 2017-05-23 11:54:48

Вам нужно либо превратить & в его сущность &amp;, либо обернуть содержимое в теги CDATA.

Если вы выбираете маршрут сущности, есть дополнительные символы, которые вам нужно превратить в сущности:

>  &gt;
<  &lt;
'  &apos;
"  &quot;

Предыстория: Остерегайтесь амперсанда при использовании XML

Википедия: Список ссылок на сущности символов XML

 1
Author: Pekka 웃, 2017-05-23 12:03:02
public function sanitize(string $data) {
    return str_replace('&', '&amp;', $data);
}

Вы правы: здесь больше контекста - пример относится к "как обращаться с данными, содержащими "&", когда мы передаем эти данные в SimpleXML. Конечно, есть и другое решение для использования <![CDATA[some stuff]]>

 0
Author: Denise Ignatova, 2018-03-24 10:28:56