error = "Not passed DOMDocument object."; return; } $xpath = new DOMXPath( $xml ); // namespace-safe method to find all elements $items = $xpath->query( "//*[local-name() = 'item']" ); if ( $items->length == 0 ) { $items = $xpath->query( "//*[local-name() = 'entry']" ); } if( $items->length !== 0 ) { foreach ( $items as $item ) { $bit = array(); foreach ( $item->childNodes as $n ) { $name = $this->rssTokenToName( $n->nodeName ); if ( $name != null ) { /** * Because for DOMElements the nodeValue is just * the text of the containing element, without any * tags, it makes this a safe, if unattractive, * value to use. If you want to allow people to * mark up their RSS, some more precautions are * needed. */ $bit[$name] = $n->nodeValue; } } $this->items[] = $bit; } } else { $this->error = 'No RSS//ATOM items found.'; return; } } /** * Return a string that will be used to map RSS elements that * contain similar data (e.g. dc:date, date, and pubDate) to the * same array key. This works on WordPress feeds as-is, but it * probably needs a way to concert dc:date format dates to be the * same as pubDate. * * @param $n String: name of the element we have * @return String Name to map it to */ protected function rssTokenToName( $name ) { switch( $name ) { case 'dc:date': case 'pubDate': case 'updated': return 'date'; case 'dc:creator': return 'author'; case 'summary': return 'description'; case 'content:encoded': return 'encodedContent'; case 'slash:comments': case 'slash:department': case 'slash:section': case 'slash:hit_parade': case 'feedburner:origLink': case 'wfw:commentRss': case 'comments': case 'category': return null; default: return $name; } } }