<?php
class Parser {
// main
public static function parse($xmlData) {
$res = null;
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->recover = true;
if(!$dom->loadXML($xmlData)) {
$res['error'] = libxml_get_errors();
libxml_clear_errors();
} else {
self::read($res, $dom);
}
return $res;
}
// tools // TODO use alternate class
private static function parseText($str) {
return trim(htmlentities($str));
}
// void
private static function read(&$res, &$dom) {
$rss = $dom->getElementsByTagName('rss');
if($rss->length == 0) {
$res['error'] = 'No rss node.';
} else {
$channel = $rss->item(0)->getElementsByTagName('channel');
if($channel->length == 0) {
$res['error'] = 'No channel node.';
} else {
self::getNodes($res, $channel, array('title', 'link', 'description'));
}
}
}
private static function getNode(&$res, &$channel, $name) {
$node = $channel->item(0)->getElementsByTagName($name);
if($node->length == 0) {
$res[$name] = null;
} else {
$res[$name] = self::parseText($node->item(0)->nodeValue);
}
}
private static function getNodes(&$res, &$channel, $names) {
foreach($names as $name) {
self::getNode($res, $channel, $name);
}
}
}
$file = file_get_contents('http://korben.info/feed');
if(!$file) {
echo 'err cannot read file'; // TODO curl internet
} else {
$res = Parser::parse($file);
var_dump($res);
}
preferences:
46.18 ms | 402 KiB | 5 Q