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"];
    }

}
?>

现在 chrome 产生了一个服务器错误,表明页面上有一些非常错误的东西,文件上传正常,所以它似乎是 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 回答