XML中的硬编码字符串已损坏

时间:2015-03-04 08:28:18

标签: php xml string hardcoded corrupt-data

这是一个奇怪的... 在XML-feed中,通过几行循环在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>

奇怪的是,这一行没有任何可以被破坏的变量。它是一个硬编码的字符串 - 见下文。这怎么可能? 该行在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 &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 个答案:

答案 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>