这是一个奇怪的... 在XML-feed中,通过几行循环在PHP中生成,一个HARDCODED字符串在一个位置发生变化。
生成的XML文件是36000行。在第8020行,发生了以下情况:
<g:google_product_category>Home & Garden > Decor > Window Treatments > Curtains & Drapes</g:google_product_category>
更改为(注意:为清晰起见,我在此处添加了星号):
<g:google_product_category>Home & Garden > Decor > Window Treatments **&ggt;** Curtains & Drapes</g:google_product_category>
奇怪的是,这一行没有任何可以被破坏的变量。它是一个硬编码的字符串 - 见下文。这怎么可能? 该行在XML文件中出现751次。只有在一个地方才会发生这种情况。
多次运行XML生成器时,会发生相同类型的错误,但不会出现在同一位置。随机的“html-safe字符”(例如&amp; gt;&amp; amp;得到一个字母重复到&amp; ggt;或&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 & Garden > Decor > Window Treatments > Curtains & Drapes</g:google_product_category>\n";
$ret .= "<g:product_type>Fototapet</g:product_type>\n";
$ret .= "</item>\n";
答案 0 :(得分:0)
我不认为在没有完全访问源和调试工具的情况下识别问题是可能的。您的问题没有提供足够的信息。
但是:您生成一个大型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>