Ошибка XML в амперсанде (&) - PullRequest
21 голосов
/ 26 октября 2010

У меня есть 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.

Ответы [ 4 ]

42 голосов
/ 26 октября 2010

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

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

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

Для экранирования других зарезервированных символов:

function xmlEscape($string) {
    return str_replace(array('&', '<', '>', '\'', '"'), array('&amp;', '&lt;', '&gt;', '&apos;', '&quot;'), $string);
}
1 голос
/ 26 октября 2010

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

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

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

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

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

0 голосов
/ 13 февраля 2019

Переключение и регулярное выражение с использованием функции escape xml.

 function XmlEscape(str) {
    if (!str || str.constructor !== String) {
        return "";
    }

    return str.replace(/[\"&><]/g, function (match) {
        switch (match) {
        case "\"":
            return "&quot;";
        case "&":
            return "&amp;";
        case "<":
            return "&lt;";
        case ">":
            return "&gt;";
        }
    });
};
0 голосов
/ 20 марта 2018
public function sanitize(string $data) {
    return str_replace('&', '&amp;', $data);
}

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

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