解析Google Reader导出

时间:2013-03-20 21:25:55

标签: php rss simplexml

我正在尝试使用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"];
    }

}
?>

现在Chrome会产生服务器错误,表明页面上出现了问题,文件上传正常,因此它似乎是simpleXML部分。

我打算稍后对数据执行更复杂的操作,我目前正试图让它只是回显页面上的数据(用于演示目的)。

非常感谢任何反馈。

以下是最终的工作代码

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

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

这需要添加来解析所有数据,但这可行。

1 个答案:

答案 0 :(得分:2)

使用SimpleXML时,您已陷入经典陷阱:解析文件或字符串时获得的第一个对象不是抽象的“文档”对象,而是父节点。在这种情况下,父节点为<opml> ... </opml>,因此示例代码中的$import<opml>节点。换句话说,您只需要$import->opml->body而不是$import->body

你的循环中还有另一个错误,就是你要求第一个<outline>元素(->outline[0]),当你想要的是循环所有元素(foreach( $whatever->outline as $feed ))。