Удалите & amp из строки при записи в xml в PHP

Я пытаюсь записать в файл XML, используя DOMDocument ссылку, содержащую знак &. Когда я попробую это, ссылка станет & в xml. Таким образом, из product=1&qty;=1 становится product=1&qty;=1 .

Не могли бы вы рассказать мне, как избежать этого?

Амперсанды должны быть закодированы следующим образом. Сменить это было бы неправильно.

См. http://www.w3.org/TR/xml/

Символ амперсанда (&) и левая угловая скобка (<) НЕ ДОЛЖНЫ появляться в их литеральной форме, за исключением случаев, когда они используются в качестве разделителей разметки или в комментарии, инструкции обработки или секции CDATA. Если они необходимы в другом месте, они ДОЛЖНЫ быть экранированы с использованием либо числовых ссылок на символы, либо строк &amp; и &lt; соответственно.

и http://www.w3.org/TR/xhtml1/#C_12

В SGML и XML символ амперсанда («&») объявляет начало ссылки на сущность (например, &reg; для зарегистрированного символа товарного знака «®»). К сожалению, многие пользовательские агенты HTML молча игнорировали неправильное использование символа амперсанда в HTML-документах – обработка амперсандов, которые не похожи на ссылки на сущности как на литературные амперсанды. Пользовательские агенты на основе XML не будут терпеть это неправильное использование, и любой документ, который использует амперсанд неправильно, не будет «действительным» и, следовательно, не будет соответствовать этой спецификации. Чтобы гарантировать совместимость документов с историческими пользовательскими агентами HTML и пользовательскими агентами на основе XML, амперсанды, используемые в документе, которые должны обрабатываться буквальными символами, должны быть выражены как ссылка на сущность (например, « &amp; »). Например, когда атрибут href элемента a ссылается на скрипт CGI, который принимает параметры, он должен быть выражен как http://my.site.dom/cgi-bin/myscript.pl?class=guest&amp;name=user а не как http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user

Как сказал Гордон, URI кодируются таким образом. Если вы не кодировали & &amp; , файл XML будет испорчен – вы получите ошибки, анализируя его. Когда вы берете строку обратно из XML-файла, если параметр &amp все еще отображается, str_replace() следующим образом:

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

Или используйте htmlspecialchars_decode() :

$str = htmlspecialchars_decode($str);

Добавленный бонус использования htmlspecialchars_decode() заключается в том, что он расшифрует любой другой HTML- htmlspecialchars_decode() который может быть в строке. Подробнее см. Здесь .