XML Parser 함수들
함수 |
리턴 값 |
설명 |
xml_error_string(code) |
string |
제공된 오류 code와 결홥된 오류 메시지를 리턴한다. |
xml_get_current_byte_index(parser) |
integer |
XML 파서를 위해 현제 바이트 인덱스를 리턴한다. |
xml_get_current_column_number(parser) |
integer |
지정된 parser를 위해 현재 행 번호를 리턴한다. |
xml_get_current_line_number(parser) |
integer |
지정된 parser를 위해 현재 줄 번호를 리턴한다. |
xml_get_error_code(parser) |
integer |
마지막으로 발생한 xml,파서의 올에대한 오류 코드를 리턴한다. |
xml_parse(parser, data, [is_final]) |
integer |
지정된 data를 분석한다. |
xml_parser_create([encoding_parameter]) |
integer |
xml 파서를 작성한다. |
xml_parser_free(parser) |
Boolean |
지정된 xml parser를 해제한다. |
xml_parser_get_option(parser, option) |
Mixed |
지정된 parser에 대한 지정된 option의 값을 리턴한다. |
xml_parser_set_option(parser, option, value) |
integer |
지정된 parser를 위해 option을 지정된 value로 설정한다. |
xml_set_character_data_handler(parser, handler) |
integer |
문자 데이터 핸들러를 등록한다. |
xml_set_default_handler(parser, handler) |
integer |
기본 핸들러를 등록한다. |
xml_set_element_handler(parser, handler) |
integer |
시작과 끝 구성 요소 핸들러를 등록한다. |
xml_set_external_entity_ref_handler(parser, handler) |
integer |
외부 엔티티 참조 핸들러를 등록한다. |
xml_set_notation_decl_handler(parser, handler) |
integer |
표기법 선언 핸들러를 등록한다. |
xml_set_processing_instruction_handler(parser, handler) |
integer |
처리 지시어 핸들러를 등록한다. |
xml_set_unparsed_entity_decl_handler(parser, handler) |
integer |
분석되지 않은 엔티티 선어 핸들러를 등록한다. |
[ xml_parser_create() ]
XML 파서 컨텍스트를 만든다.
int xml_parser_create(string [encoding_parameter]);
encoding_parameter : 파서가 사용할 문자 소스 암호화. 일단 설정된 소스 암호화는 나중에 변경할 수 없다. 가능한 값으로는 ISO-8859-1(default) , US-ASCII, UTF-8
[ xml_set_element_handler()]
"start()"와 “end()"ㅅ구성 요소 핸들러 함수들을 XML 파서에 등록한다.
int xml_set_element_handler( int parser, string startElementHandler , string endElementHandler);
parser : XML 파서의 핸들러. 시작과 끝 구성 요소 핸들러들이 등록되어있다.
startElementHandler : 시작 구성 요소 핸들러 함수의 이름. 만약 null이 지정되면 시작 구성 요소 핸들러가 등록되지 않은 것이다.
endElementHandler : 끝 구성 요소 핸들러 함수의 이름. 만약 null이 지정되면 끝 구성 요소 핸들러가 등록되지 않는다.
< satartElementHandler(int parser, string name, string attribs[]); >
parser : 이함수를 호출하고 있는 XML 파서에 대한 참조
name : 구성 요소의 이름
attribs() : 구성 요소의 속성들을 포함하고 있는 조합배열
< endElementHandler(int parser, string name); >
parser : 이 함수를 호출하고 있는 XML 파서로의 참조
name 구성요소 이름
[ xml_set_character_data_handler() ]
XML 파서에 문자 데이터 핸들러를 등록한다.
int xml_set_character_data_handler( int parser, string characterDataHandler);
parser : 문자 데이터 핸들러가 등록된 XML 파서를 위한 핸들
characterDataHandler : 문자 데이터 핸들러 함수의 이름. 만약 null이 지정되면 문자 데이터 핸들러가 등록되지 않는다.
< characterDataHandler( int parser, string data); >
parser : 이 함수를 호출 중인 XML 파서로의 참조
data : XML 문서에 제공되는 문자 데이터. 파서는 문자 데이터를 이TSms 그대로 리턴하며, 어떠한 공백 문자도 제거하지 않는다.
[ xml_parse() ]
XML 문서의 컨텐츠를 파서로 전달한다. 이 함수는 문서의 실제 분석을 수행한다(XML 문서에서 노드들을 만나면 등록된 적당한 핸들러들을 호출한다.).
이 함수는 XML 문서에 있는 다양한 노드 타입들에 대한 핸들러 함수들이 모두 파서에 등록된 후에 호출된다.
int xml_parse( int parser, string data, int [isFinal]);
parser : 제공된 데이터를 분석할 XML 파서의 핸들
data : XML 문서의 컨텐츠. XML 파일의 전체 컨텐츠는 한 번의 호출로 전달될 필요는 없다.
isFinal : 입력 데이터의 끝을 지정한다.
전달된 데이터의 분석이 가능하면 true를 리턴하고, 그렇지 않으면 false를 리턴한다. 실패이 경우 , 오류정보는 xml_get_error_code()와 xml_get_error_string()함수를 이용하여 발견 할 수 있다.
[ xml_get_error_code ]
XML 파서로부터 오류 코드를 리턴한다.
int xml_get_error_code( int parser);
parser : XML 파서으 핸들
분석에 실패하거나 유호한 XML파서가 아닐 경우 flase를 리턴한다.
[ xml_error_string ]
오류 코드에 따라 오류 메시지를 리턴한다.
string xml_get_error_code( int errorCode);
ErrorCode : xml_get_error_code() 함수가 리턴한 오류 코드
[ 예제 ]
<?
class RSSParser {
var $feed_info = array();
var $feed_articles = array();
var $inchannel = FALSE;
var $initem = FALSE;
var $inimage = FALSE;
var $current_item = array();
var $current_el = FALSE;
// 여는 태그 처리
function startElement($parser, $name, $attrs)
{
$el = strtoupper($name);
if ($el == 'RSS') {
return;
} else if ($el == 'CHANNEL') {
$this->inchannel = TRUE;
} else if ($el == 'ITEM') {
$this->initem = TRUE;
} else if ($el == 'IMAGE') {
$this->inimage = TRUE;
} else {
$this->current_el = $el;
}
}
// 닫는 태그 처리
function endElement($parser, $name)
{
$el = strtoupper($name);
if ($el == 'RSS') {
return;
} else if ($el == 'CHANNEL') {
$this->inchannel = FALSE;
} else if ($el == 'ITEM') {
$this->feed_articles[] = $this->current_item;
$this->current_item = array();
$this->initem = FALSE;
} else if ($el == 'IMAGE') {
$this->inimage = FALSE;
} else {
$this->current_el = FALSE;
}
}
// 태그 사이의 데이터 처리
function characterData($parser, $data)
{
if ($this->initem) {
if ($this->current_el) {
$this->current_item[$this->current_el] .= $data;
}
} else if ($this->inimage) {
} else if ($this->inchannel) {
if ($this->current_el) {
$this->feed_info[$this->current_el] .= $data;
}
}
}
}
function parse_save_rss($document)
{
// RSS 피드의 인코딩을 UTF-8에 맞춤
if (preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $document, $m)) {
$in_enc = strtoupper($m[1]);
if ($in_enc != 'UTF-8') {
$document = preg_replace('/(<?xml.*encoding=[\'"])(.*?)([\'"].*?>)/m', '$1UTF-8$3', $document);
$document = iconv($in_enc, 'UTF-8', $document);
}
}
// XML 및 RSS 분석기 생성
$xml_parser = xml_parser_create('UTF-8');
$rss_parser = new RSSParser();
xml_set_object($xml_parser, $rss_parser);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!xml_parse($xml_parser, $document, true)) {
printf("XML error: %s at line %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser));
} else {
// 분석결과를 DB에 저장
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or die('Could not connect: '.mysql_error());
mysql_select_db('my_database') or die('Could not select database');
foreach ($rss_parser->feed_articles as $article) {
$published = date('Y-m-d H:i:s', strtotime($article['PUBDATE']));
$query = sprintf("INSERT INTO feed_articles (source, title, link, description, published) VALUES ('%s', '%s', '%s', '%s', '%s')",
mysql_real_escape_string($rss_parser->feed_info['TITLE']),
mysql_real_escape_string($article['TITLE']),
mysql_real_escape_string($article['LINK']),
mysql_real_escape_string($article['DESCRIPTION']),
$published);
if (mysql_query($query, $link)) echo $query."\n";
}
}
xml_parser_free($xml_parser);
}
// 읽어올 피드 목록
$feed_urls = array(
'http://blog.rss.naver.com/kickthebaby.xml',
'http://srlog.egloos.com/index.xml',
'http://feeds.feedburner.com/tapestrydilbert'
);
foreach ($feed_urls as $url) {
$handle = fopen($url, 'r');
if ($handle) {
$document = '';
while (!feof($handle)) {
$document .= fgets($handle, 4096);
}
echo $url."\n";
// 읽어온 피드를 분석하여 DB에 저장
parse_save_rss($document);
fclose($handle);
}
}
?>
[출처] XML Parser 함수 표|작성자 아슈크림