0

以下のコード (データベース呼び出しを除く) を実行した後、「331 行目の列 7 のエラー: ドキュメントの末尾に余分なコンテンツがあります」というエラーが表示されます。これらのフォーラムを調べましたが、解決策が見つかりませんでした。その余分な空白を追加する必要があるランダムな文字やコードはありません...アイデアはありますか?

<?php 
header('Content-type: text/xml');
mysql_connect("localhost", "---", "---");
mysql_select_db("---");

$query = "SELECT title FROM table";
$result = mysql_query($query);

$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument();
$xml->setIndent(true);
$xml->writeRaw('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">');
$xml->startElement('url');
while ($row = mysql_fetch_assoc($result)) {
    if(!empty($row)){
        $title = $row['title'];
        $xml->startElement('loc');
            $xml->writeRaw('http://domain.com/article/');
        $xml->endElement();
        $xml->startElement('news:news');
            $xml->startElement("news:publication");
                $xml->startElement("news:name");
                    $xml->writeRaw('Name');
                $xml->endElement();
                $xml->startElement("news:language");
                    $xml->writeRaw('en');
                $xml->endElement();
            $xml->endElement();
            $xml->startElement('news:title');
                $xml->writeRaw($title);
            $xml->endElement();
            $xml->endElement();
    }
}
$xml->endElement();
$xml->flush();
4

1 に答える 1

3

プログラミングの重要なポイントの 1 つは、一部のコードの複雑さを軽減することです。これには、インデントを減らして、コードが互いにくっつかないようにすることも含まれます。それはしばしば従うのが難しいです。

たとえば、while 本体の内部にある if 句を大幅に削減して、内部をすでに 1 レベル上に移動できます。

while ($row = mysql_fetch_assoc($result)) {

    if (empty($row)) {
        continue;
    }

    $title = $row['title'];
    ...
}

ループのcontinue内側は次の繰り返しです。

作成する XML タグのインデントもあります。すべてを防ぐことはできませんが、一部は防ぐことができます。たとえば、このXMLWriter::writeElement()メソッドを使用すると、内部テキストを含む wote 要素を出力できます。これにより、次の 3 行を削減できます。

$xml->startElement('loc');
    $xml->writeRaw('http://domain.com/article/');
$xml->endElement();

1つに:

$xml->writeElement('loc', 'http://domain.com/article/');

このような行のグループが複数あるため、実際のコードはかなり短縮されています。ドキュメントを終了することで終了も改善でき、フラッシュする必要さえありません。インデントを読みやすくするために、角括弧を使用してインデントを表現することもできます。

while ($row = mysql_fetch_assoc($result)) {

    if (empty($row)) {
        continue;
    }

    $title = $row['title'];

    $xml->writeElement('loc', 'http://domain.com/article/');

    $xml->startElement('news:news');
    {
        $xml->startElement("news:publication");
        {
            $xml->writeElement("news:name", 'Name');
            $xml->writeElement("news:language", 'en');
        }
        $xml->endElement();

        $xml->writeElement('news:title', $title);
    }
    $xml->endElement();
}

$xml->endDocument();

したがって、これは読みやすいだけでなく、エラーが発生した場合も修正されているという良いニュースがあります。これは、 XMLWriter::writeRaw()メソッドが削除されたためです。その関数は生のテキストを書き込みます。つまり、エスケープされていないことを意味します。

$title = 'hackers <3 noodles';

$xml->startElement('news:title');
    $xml->writeRaw($title);
$xml->endElement();

出力:

<news:title>hackers <3 noodles</news:title>
                    ^

出力が示すように、<文字はそのまま出力されます。タイトルによっては、純粋な XML コードでさえドキュメント構造全体を破壊してエラーにつながる可能性があります。UsingXMLWriter::writeElement()はそれの影響を受けません:

$title = 'hackers <3 noodles';

$xml->writeElement('news:title', $title);

出力:

<news:title>hackers &lt;3 noodles</news:title>
                    ^^^^

出力が示すように、ここでは適切な XML エンティティが使用され、ドキュメント構造が維持されます。

したがって、最初に探していたメソッドはXMLWriter::text(). しかし、最適化されたコードにはその問題がなくなったため、この場合はもう必要ありません。すべてのテキスト出力は、 によって適切にエンコードされますXMLReader::writeElement()Retain XML code when using PHP XMLWriter::writeElementも参照してください。これは同じトピックですが、反対のトピックです。

質問が少し古かったので、これがまだあなたに役立つことを願っています。

于 2013-09-27T16:03:09.567 に答える