我正在尝试使用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"];
}
这需要添加来解析所有数据,但这可行。
答案 0 :(得分:2)
使用SimpleXML时,您已陷入经典陷阱:解析文件或字符串时获得的第一个对象不是抽象的“文档”对象,而是父节点。在这种情况下,父节点为<opml> ... </opml>
,因此示例代码中的$import
是<opml>
节点。换句话说,您只需要$import->opml->body
而不是$import->body
。
你的循环中还有另一个错误,就是你要求第一个<outline>
元素(->outline[0]
),当你想要的是循环所有元素(foreach( $whatever->outline as $feed )
)。