0

SimpleXML を使用して、Google Reader エクスポートから生成された xml ファイルを解析しようとしています。

ファイルの例:

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
    <head>
        <title>TheTechBox subscriptions in Google Reader</title>
    </head>
    <body>
        <outline text="Engadget RSS Feed" title="Engadget RSS Feed"
            type="rss" xmlUrl="http://www.engadget.com/rss.xml" htmlUrl="http://www.engadget.com"/>
        <outline text="xkcd.com" title="xkcd.com" type="rss"
            xmlUrl="http://xkcd.com/rss.xml" htmlUrl="http://xkcd.com/"/>
    </body>
</opml>

これは私がこれまでに試したことです。ユーザーはファイルをこのフォームにアップロードし、フォームをループしてデータを抽出する必要があります。

<?php
if ($_FILES["file"]["error"] > 0)
{
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{

    $import = new SimpleXMLElement($_FILES["file"]["name"]);

    foreach($import->opml->body->outline[0] as $feed){
        echo $feed["title"];
    }

}
?>

現在、クロムはページに何か非常に問題があることを示すサーバー エラーを生成します。ファイルは正常にアップロードされるため、simpleXML 部分のように見えます。

後でデータを使ってもっと複雑なことをする予定です。現在、ページ上のデータをエコーするためだけに取得しようとしています (デモ目的で)。

どんなフィードバックでも大歓迎です。

これが最終的な作業コードです

$import = simplexml_load_file($_FILES["file"]["tmp_name"]);

foreach($import->body->outline as $feed){
    echo $feed["title"];
}

これは、すべてのデータを解析するために追加する必要がありますが、これは機能します。

4

1 に答える 1

2

SimpleXML を使用すると、古典的なトラップに陥ってしまいます。ファイルまたは文字列を解析するときに取得する最初のオブジェクトは、抽象的な「ドキュメント」オブジェクトではなく、親ノードです。この場合、親ノードは<opml> ... </opml>であるため$import、サンプル コードではその<opml>ノードです。つまり、$import->opml->bodyただ言う必要はありません$import->body

ループには別のバグもあります。つまり、すべての要素 ( ) をループしたいときに、最初の<outline>要素 ( ) を要求しているということです。->outline[0]foreach( $whatever->outline as $feed )

于 2013-03-20T21:52:07.453 に答える