-1

これは奇妙なものです... 数行にわたるループによって PHP で生成された XML フィードでは、1 つの HARDCODED 文字列が 1 つの場所で変更されます。

生成された 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 回発生します。これが発生するのは 1 か所だけです。

XML ジェネレーターを複数回実行すると、同じ種類のエラーが発生しますが、同じ場所では発生しません。ランダムな「html セーフ文字」 ( & gt ; & amp ; のように & ggt ; または & aamp ; に複製された 1 文字を取得)

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";
4

1 に答える 1

0

ソースとデバッグ ツールに完全にアクセスできなければ、問題を特定することはできないと思います。あなたの質問は十分な情報を提供していません。

BUT: 大きな 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>
于 2015-03-04T10:13:03.227 に答える