" ", 'iexcl' => "¡", 'cent' => "¢", 'pound' => "£", 'curren' => "¤", 'yen' => "¥", 'brvbar' => "¦", 'sect' => "§", 'uml' => "¨", 'copy' => "©", 'ordf' => "ª", 'laquo' => "«", 'not' => "¬", 'shy' => "­", 'reg' => "®", 'macr' => "¯", 'deg' => "°", 'plusmn' => "±", 'sup2' => "²", 'sup3' => "³", 'acute' => "´", 'micro' => "µ", 'para' => "¶", 'middot' => "·", 'cedil' => "¸", 'sup1' => "¹", 'ordm' => "º", 'raquo' => "»", 'frac14' => "¼", 'frac12' => "½", 'frac34' => "¾", 'iquest' => "¿", 'Agrave' => "À", 'Aacute' => "Á", 'Acirc' => "Â", 'Atilde' => "Ã", 'Auml' => "Ä", 'Aring' => "Å", 'AElig' => "Æ", 'Ccedil' => "Ç", 'Egrave' => "È", 'Eacute' => "É", 'Ecirc' => "Ê", 'Euml' => "Ë", 'Igrave' => "Ì", 'Iacute' => "Í", 'Icirc' => "Î", 'Iuml' => "Ï", 'ETH' => "Ð", 'Ntilde' => "Ñ", 'Ograve' => "Ò", 'Oacute' => "Ó", 'Ocirc' => "Ô", 'Otilde' => "Õ", 'Ouml' => "Ö", 'times' => "×", 'Oslash' => "Ø", 'Ugrave' => "Ù", 'Uacute' => "Ú", 'Ucirc' => "Û", 'Uuml' => "Ü", 'Yacute' => "Ý", 'THORN' => "Þ", 'szlig' => "ß", 'agrave' => "à", 'aacute' => "á", 'acirc' => "â", 'atilde' => "ã", 'auml' => "ä", 'aring' => "å", 'aelig' => "æ", 'ccedil' => "ç", 'egrave' => "è", 'eacute' => "é", 'ecirc' => "ê", 'euml' => "ë", 'igrave' => "ì", 'iacute' => "í", 'icirc' => "î", 'iuml' => "ï", 'eth' => "ð", 'ntilde' => "ñ", 'ograve' => "ò", 'oacute' => "ó", 'ocirc' => "ô", 'otilde' => "õ", 'ouml' => "ö", 'divide' => "÷", 'oslash' => "ø", 'ugrave' => "ù", 'uacute' => "ú", 'ucirc' => "û", 'uuml' => "ü", 'yacute' => "ý", 'thorn' => "þ", 'yuml' => "ÿ" ); var $namespaces = array( 'DC' => 'http://purl.org/dc/elements/1.1/', 'RDF' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'RSS' => 'http://purl.org/rss/1.0/', 'RSS2'=> 'http://backend.userland.com/rss2', 'RDF2' => 'http://my.netscape.com/rdf/simple/0.9/' ); function buildStruct($xmldata) { // Create a parser object $p = new XMLParser; // Define our known namespaces foreach ($this->namespaces as $space => $uri) { $p->definens($space,$uri); } // Define base namespace $p->definens("UNDEF"); $this->parseEntities($xmldata); // Tell the parser to get the file. $p->setXmlData($xmldata); // Tell the parser to build the tree. $p->buildXmlTree(); // Spit the tree out so we can see it return $p->getXmlTree(); } function parseEntities(&$data) { foreach($this->entities as $entity => $replace) { $data = preg_replace('/&' . $entity . ';/',$replace,$data); } $data = preg_replace('/&[ ]*;/','',$data); } function parseFeed($xmldata) { $data =& $this->buildStruct(&$xmldata); if(is_array($data)) { foreach($data as $child) { if(is_array($child)) { switch($child['tag']) { case "RSS:RSS": case "UNDEF:RSS": case "RSS2:RSS": $info = $this->parseRSS(&$child); break; case "RDF:RDF": $info = $this->parseRDF(&$child); break; default: $info["warning"] .= "Unknown document format: " . $child['tag'] . "\n"; break; } } } } return $info; } function parseRDF(&$data) { if(is_array($data['children'])) { foreach($data['children'] as $child) { if(is_array($child)) { switch($child['tag']) { case "RSS:CHANNEL": case "RDF2:CHANNEL": $channel = $this->getRDFChannel(&$child); break; case "RSS:ITEM": case "RDF2:ITEM": $item[] = $this->getRDFItem(&$child); break; default: break; } } } } return array('channel' => $channel, 'item' => $item); } function parseRSS(&$data) { if(is_array($data['children'])) { foreach($data['children'] as $child) { if(is_array($child)) { switch($child['tag']) { case "RSS:CHANNEL": case "RSS2:CHANNEL": case "UNDEF:CHANNEL": $info = $this->getRSSChannel(&$child); break; default: break; } } } } return $info; } function getRDFChannel($data) { if(is_array($data['children'])) { foreach($data['children'] as $child) { if(is_array($child)) { switch($child['tag']) { case "RSS:TITLE": case "RDF2:TITLE": $channel['title'] = $child['children'][0]; break; case "RSS:LINK": case "RDF2:LINK": $channel['link'] = $child['children'][0]; break; case "RSS:DESCRIPTION": case "RDF2:DESCRIPTION": $channel['description'] = $child['children'][0]; break; case "RSS:WEBMASTER": $channel['creator'] = $child['children'][0]; break; default: break; } } } } return $channel; } function getRSSChannel($data) { if(is_array($data['children'])) { foreach($data['children'] as $child) { if(is_array($child)) { switch($child['tag']) { case "UNDEF:TITLE": case "RSS:TITLE": case "RSS2:TITLE": $channel['title'] = $child['children'][0]; break; case "UNDEF:LINK": case "RSS:LINK": case "RSS2:LINK": $channel['link'] = $child['children'][0]; break; case "UNDEF:DESCRIPTION": case "RSS:DESCRIPTION": case "RSS2:DESCRIPTION": $channel['description'] = $child['children'][0]; break; case "UNDEF:ITEM": case "RSS:ITEM": case "RSS2:ITEM": $item[] = $this->getRSSItem(&$child); break; case "UNDEF:LASTBUILDDATE": case "RSS:LASTBUILDDATE": case "RSS2:LASTBUILDDATE": $channel['lastbuilddate'] = strtotime($child['children'][0]); break; default: break; } } } } return array('channel' => $channel, 'item' => $item); } function getRDFItem($data) { if(is_array($data['children'])) { foreach($data['children'] as $child) { if(is_array($child)) { switch($child['tag']) { case "RSS:TITLE": case "RDF2:TITLE": $item['title'] = $child['children'][0]; break; case "RSS:LINK": case "RDF2:LINK": $item['link'] = $child['children'][0]; break; case "RSS:DESCRIPTION": case "RDF2:DESCRIPTION": $item["description"] = $child['children'][0]; break; case "DC:DATE": $item["date"] = $this->dcDateToUnixTime($child['children'][0],0); $item["locdate"] = $this->dcDateToUnixTime($child['children'][0],1); break; default: break; } } } } return $item; } function getRSSItem($data) { if(is_array($data['children'])) { foreach($data['children'] as $child) { if(is_array($child)) { switch($child['tag']) { case "UNDEF:TITLE": case "RSS:TITLE": case "RSS2:TITLE": $item['title'] = $child['children'][0]; break; case "UNDEF:LINK": case "RSS:LINK": case "RSS2:LINK": $item['link'] = $child['children'][0]; break; case "UNDEF:DESCRIPTION": case "RSS:DESCRIPTION": case "RSS2:DESCRIPTION": $item["description"] = $child['children'][0]; break; case "DC:DATE": $item["date"] = $this->dcDateToUnixTime($child['children'][0],0); $item["locdate"] = $this->dcDateToUnixTime($child['children'][0],1); break; case "UNDEF:PUBDATE": case "RSS:PUBDATE": case "RSS2:PUBDATE": $item["date"] = strtotime($child['children'][0]); $item["locdate"] = strtotime($child['children'][0]); break; default: break; } } } } return $item; } function dcDateToUnixTime($dcdate,$cvttz = 1) { list($date,$time) = explode("T",$dcdate); preg_match( "/([0-9]{2}:[0-9]{2}:[0-9]{2})(\-?\+?)([0-9]{2}):([0-9]{2})/", $time, $yo ); if ($cvttz == 1) { return strtotime($date . " " . $yo[1] . $yo[2] . $yo[3] . $yo[4]); } else { return strtotime($date . " " . $yo[1]); } } } ?>