PHP:如何检测/解析rss/feed XML中的所有标签?
问题描述:
我从一个样本测试rss feed阅读器。 它使用:PHP:如何检测/解析rss/feed XML中的所有标签?
$xmlDoc = new DOMDocument();
$xmlDoc->load($url);
$items = $xmlDoc->getElementsByTagName('item');
for ($i=0; $i < $items->length; $i++) {
$item_title = $items->item($i)->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
$item_link = $items->item($i)->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
$item_desc = $items->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;
}
当我检查XML,它还有另一个标签,如:
- 日期
- 图片链接
我怎样才能把这些所有其他标签?因为我不能称自己。
例如,对于'日期',我不能使用getElementsByTagName('date')
。
它示值误差:Fatal error: Call to a member function item() on a non-object
- 那么,有没有固定的标签名称?
- 如果是这样,这是什么? (或)我如何知道/解析/分离/提取XML内的所有可用标记?
答
您可以递归访问每个节点,您可以选择从一个通过检查,让您的数据,如果标签名称符合您的需求之一:
$indent = 0;
$tab = 4;
function indent($indent){
$r = "";
for($i=0;$i<$indent;$i++)
$r .= " ";
return $r;
}
function parseNode($node){
global $indent,$tab;
if(!$node->hasChildNodes())
return;
$indent += $tab;
// if($note->tagName == "item") do something special
echo indent($indent)."<".$note->nodeName.">";
foreach ($node->childNodes as $c)
parseNode($c);
echo indent($indent)."</".$note->nodeName.">";
$indent -= $tab;
}
$xmlDoc = new DOMDocument();
$xmlDoc->load($url);
parseNode($xmlDoc);
你的问题不是太清楚。你为什么不用其他标签使用相同的方法? – JohnP 2011-05-23 05:09:59
是的,因为我不知道如何调用其他标签。例如,对于“日期”,这个'getElementsByTagName('date')'或'getElementsByTagName('lastUpdated')'不起作用。它显示:致命错误:调用一个非对象的成员函数item()。我完全不知道这个RSS/XML主题。 – Alvin 2011-05-23 05:21:50
我认为你最好使用[simplexml](http://php.net/simplexml)如果你在项目中不是太远,这可能是一个更好的选择 – JohnP 2011-05-23 05:25:42