시소당
엊그제 올렸다가 몇가지 수정하고 추가해서 다시 올립니다. ㅜㅡ;;
파일은 reader 클래스를 포함한 파일(소스1)과 출력(소스2) 파일입니다.
xml 이 지원되도록 컴파일 되어져야 합니다.
이넘이 작동하는 모습은
http://hk.dotnet.cc/rss.php
에서 확인하실 수 있습니다. 제가 자주가는 http://www.dpreview.com 에서 제공하는 rss feed 입니다.
-------------------------------------------------
소스1 (rss.reader.class.php)
<?
/**
* http://web.resource.org/rss/1.0/spec
* http://blogs.law.harvard.edu
*/
class rss
{
private
$parser = null;
private
$current_tag = null;
private
$current_attribute = null;
private
$rdf_code = null;
private
$item_count = 0;
public
$channel = array();
public function __construct()
{
$this->parser = xml_parser_create();
}
public function parse(
$rss_file)
{
xml_set_object(
$this->parser, &
$this);
xml_set_element_handler(
$this->parser, "_startElement", "_endElement");
xml_set_character_data_handler(
$this->parser, "_characterData");
$fp = @fopen(
$rss_file, "r");
if(!
$fp)
{
throw new Exception("Error reading RSS file : " .
$rss_file);
}
else
{
while(
$rssData = fread(
$fp, 4096))
{
if(xml_parse(
$this->parser,
$rssData, feof(
$fp)) == false)
{
throw new Exception(xml_error_string(xml_get_error_code(
$this->parser)) . " Line : " . xml_get_current_line_number(
$this->parser));
}
}
fclose(
$fp);
xml_parser_free(
$this->parser);
}
}
private function _startElement(
$parser,
$name,
$attribute = null)
{
$this->current_tag =
$name;
$this->current_attribute =
$attribute;
switch(
$this->current_tag)
{
case "CHANNEL" :
$this->rdf_code = "channel";
break;
case "IMAGE" :
$this->rdf_code = "image";
break;
case "ITEM" :
$this->rdf_code = "item";
break;
case "CLOUD" :
$this->rdf_code = "cloud";
break;
case "TTL" :
$this->rdf_code = "ttl";
break;
case "TEXTINPUT" :
$this->rdf_code = "textinput";
break;
}
}
private function _endElement(
$parser,
$name,
$attribute = null)
{
if(
$name == "ITEM")
{
$this->item_count += 1;
}
$this->current_tag = null;
$this->current_attribute = null;
}
private function _characterData(
$parser,
$cdata)
{
$cdata = iconv(xml_parser_get_option(
$parser, XML_OPTION_TARGET_ENCODING), "EUC-KR",
$cdata);
if(
$this->rdf_code == "channel")
{
switch(
$this->current_tag)
{
case "TITLE" :
$this->channel['channel']['title'] .=
$cdata;
break;
case "LINK" :
$this->channel['channel']['link'] .=
$cdata;
break;
case "DESCRIPTION" :
$this->channel['channel']['description'] .=
$cdata;
break;
case "LANGUAGE" :
$this->channel['channel']['language'] .=
$cdata;
break;
case "COPYRIGHT" :
$this->channel['channel']['copyright'] .=
$cdata;
break;
case "MANAGINGEDITOR" :
$this->channel['channel']['managingeditor'] .=
$cdata;
break;
case "WEBMASTER" :
$this->channel['channel']['webmaster'] .=
$cdata;
break;
case "PUBDATE" :
$this->channel['channel']['pubdate'] .=
$cdata;
break;
case "LASTBUILDDATE" :
$this->channel['channel']['lastbuilddate'] .=
$cdata;
break;
case "DOCS" :
$this->channel['channel']['docs'] .=
$cdata;
break;
}
}
else if(
$this->rdf_code == "image")
{
switch(
$this->current_tag)
{
case "URL" :
$this->channel['channel']['image_url'] .=
$cdata;
break;
case "WIDTH" :
$this->channel['channel']['image_width'] .=
$cdata;
break;
case "HEIGHT" :
$this->channel['channel']['image_height'] .=
$cdata;
break;
case "TITLE" :
$this->channel['channel']['image_title'] .=
$cdata;
break;
case "LINK" :
$this->channel['channel']['image_link'] .=
$cdata;
break;
}
}
else if(
$this->rdf_code == "item")
{
switch(
$this->current_tag)
{
case "LINK" :
$this->channel['item'][
$this->item_count]['link'] .=
$cdata;
break;
case "TITLE" :
$this->channel['item'][
$this->item_count]['title'] .=
$cdata;
break;
case "DESCRIPTION" :
$this->channel['item'][
$this->item_count]['description'] .=
$cdata;
break;
case "PUBDATE" :
$this->channel['item'][
$this->item_count]['pubdate'] .=
$cdata;
break;
}
}
}
public function __destruct()
{
}
};
?>
-------------------------------------------------
소스2 (rss.html)
<?
include_once("rss.reader.class.php");
using("xml");
$rss = new rss();
try
{
// rss 주소
$rss->parse("http://slashdot.org/rss/index.rss");
}
catch(Exception
$e)
{
die(
$e->getMessage());
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<style type="text/css">
<!--
TABLE, TR, TD, TEXTAREA, INPUT, SELECT, OPTION
{
font-family:Tahoma;
font-size:9pt;
}
-->
</style>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<table border="0" align="center" width="100%" cellpadding="0" cellspacing="0">
<tr>
<td>
<? if(isset(
$rss->channel['channel'])) { ?>
<table border="0" align="left" width="0%" cellpadding="3" cellspacing="0"><tr>
<td>
<? if(
$rss->channel['channel']['image_url'] != null) { ?>
<a href="<?=
$rss->channel['channel']['image_link'] ?>"><img src="<?=
$rss->channel['channel']['image_url'] ?>" title="<?=
$rss->channel['channel']['image_title'] ?>" border="0" target="_blank">
<? } ?>
</td>
<td>
<?=
$rss->channel['channel']['title'] ?><br>
<?=
$rss->channel['channel']['description'] ?>
</td>
</tr></table>
<? } ?>
</td>
</tr>
<tr>
<td><hr></td>
</tr>
<tr>
<td>
<table border="0" align="left" width="100%" cellpadding="5" cellspacing="0">
<?
if(isset(
$rss->channel['item']))
{
for(
$i = 0;
$i < sizeof(
$rss->channel['item']);
$i++)
{
?>
<tr>
<td><a href="<?=
$rss->channel['item'][
$i]['link'] ?> " target="_blank"><?=
$rss->channel['item'][
$i]['title'] ?></a></td>
</tr>
<tr>
<td><?= nl2br(html_entity_decode(
$rss->channel['item'][
$i]['description'])) ?></td>
<?
}
}
?>
</tr></table>
</td>
</tr>
</table>
건강이 05-06-17 19:59
점점 PHP 5.0 사용하시는분이 느나 보네요..준비를 해나가야 겠습니다.
점점 PHP 5.0 사용하시는분이 느나 보네요..준비를 해나가야 겠습니다.
x딜마 05-06-17 21:30
using(\"xml\"); <--- 이함수 뭔가요 에러가 나네요??
using(\"xml\"); <--- 이함수 뭔가요 에러가 나네요??
거니 05-06-18 13:18
x딜마 /
핫.. 구문 삭제 부탁드립니다. 제가 사용하는 함수인데 빼먹고 안지웠네엽~ 죄송..ㅜ.ㅡ
x딜마 /
핫.. 구문 삭제 부탁드립니다. 제가 사용하는 함수인데 빼먹고 안지웠네엽~ 죄송..ㅜ.ㅡ
우워오 05-09-16 00:08
PHP5 버전이 아니면 한글이 깨져버리는 문제가 있죠..-_-;
출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=40519&sca=&sfl=wr_subject%7C%7Cwr_content&stx=php5&sop=and&page=5