반응형

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);
 }
}
?>

Posted by 1010