Закодированная строка в XML повреждена

Вот странный …
В XML-ленте, сгенерированном в PHP с помощью цикла из нескольких строк, одна строка HARDCODED изменяется в ОДНОЙ точке.

Сгенерированный XML-файл состоит из 36000 строк. В строке 8020 произошло следующее:

<g:google_product_category>Home &amp; Garden &gt; Decor &gt; Window Treatments &gt; Curtains &amp; Drapes</g:google_product_category>

был изменен на (примечание: звездочки, которые я добавил здесь для ясности):

<g:google_product_category>Home &amp; Garden &gt; Decor &gt; Window Treatments **&ggt;** Curtains &amp; Drapes</g:google_product_category>

Странно то, что в этой строке нет переменных, которые могут быть повреждены. Это жестко закодированная строка — см. Ниже. Как это возможно?
Строка встречается 751 раз в XML-файле. Это происходит только в одном месте.

При многократном запуске XML-генератора возникает тот же тип ошибки, но не в одном и том же месте. Случайные «html-безопасные символы» (например, & GT; & amp; получить одну копию для & ггт; или же & Aamp;

XML генерируется не как объект, а с помощью цикла for, который создает строку следующим образом:

$ret .= "<item>\n";
$ret .= "<g:id>ft-".$row["entry_id"]."</g:id>\n";
$ret .= "<g:title>".$row["title"]."</g:title>\n";
$ret .= "<g:description>".$row["description"]."</g:description>\n";
$ret .= "<g:link>http://www.example.com/sidor/fototapet/".$row["entry_id"]."?google=true</g:link>\n";
$ret .= "<g:image_link>http://www.example.com/".$this->get_filename($row2["field_id_6"],$row["entry_id"])."</g:image_link>\n";
$ret .= "<g:condition>new</g:condition>\n";
$ret .= "<g:availability>in stock</g:availability>\n";
$ret .= "<g:price>". ceil(280*$price_mod) ."</g:price>\n";
$ret .= "<g:google_product_category>Home &amp; Garden &gt; Decor &gt; Window Treatments &gt; Curtains &amp; Drapes</g:google_product_category>\n";
$ret .= "<g:product_type>Fototapet</g:product_type>\n";
$ret .= "</item>\n";

-1

Решение

Я не думаю, что можно определить проблему без полного доступа к вашему источнику и инструментам отладки. Ваш вопрос не предоставляет достаточно информации.

НО: вы генерируете большой XML, вы должны записать его прямо в файл.

Если вы генерируете XML как текст, вам нужно экранировать динамические значения, такие как $row['entry], htmlspecialchars() могу сделать это для вас.

Вот XML API для этой задачи — XMLWriter. Ниже приведен упрощенный пример:

$xmlns = [
'g' => 'urn:google-namespace'
];

$writer = new XMLWriter;
$writer->openURI('php://output');
$writer->startDocument('1.0', 'UTF-8');
$writer->setIndent(2);
$writer->startElement('rss');

$writer->startElement('item');
$writer->writeElementNS('g', 'item', $xmlns['g'], 'id-from-db');
$writer->endElement();

$writer->endElement();
$writer->endDocument();

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<rss>
<item>
<g:item xmlns:g="urn:google-namespace">id-from-db</g:item>
</item>
</rss>
0

Другие решения

Других решений пока нет …