PHP 와 XML: 使用expat函数(two)
让我们看一下实际处理这个文档的PHP代码。
/*NewsBoy : Justin Grant가 PHP로 작성한 웹용 뉴스 시스템(웹: jusgrant.cjb. net 또는 justin.host.za.net 메일: justin@glendale.net) 3월 25일 V0.0.2 Newsboy를 PHP 클래스로 변환하여 레이아웃을 쉽게 수정할 수 있습니다. 또한 생성된 HTML을 좀 더 읽기 쉽게 만들었습니다. 24 March V0.0.1 매우 대략적이고 기본적인 초기 버전을 완료했습니다.*/
class newsboy { var $xml_parser; var $xml_file; var $html; var $open_tag ; var $close_tag ;
//클래스 생성자
function newsboy() { $this->xml_parser = ""; $this->xml_file = ""; $this->html = ""; $this->open_tag = array(
//이것은 기본 설정이지만 수정하기가 매우 쉽습니다
"NEWSBOY" => "nn", "STORY" => " ", "DATE " => "", "SLUG" => " ", "TEXT" => "", "PIC" => "", "NEWLINE" => "" ); $this->close_tag = array( "NEWSBOY" => "
nnn", "STORY" => "", "DATE" => "", "SLUG" => "
", "TEXT" => "n", "PIC" => " "
" ) }
//클래스 소멸자(PHP는 소멸자를 지원하지 않으므로 수동으로 호출해야 함)
function destroy() { xml_parser_free($this->xml_parser) }
//클래스 멤버
function concat($str) { $this->html .= $str }
function startElement; ($parser, $name, $attrs) { //전역 $open_tag; if ($format= $this->open_tag[$name]) { $this->html .= $format } }
function endElement($parser, $name) { global $close_tag; if ($format= $this->close_tag[$name]) { $this->html .= $format } }
function CharacterData( $parser, $data) { $this->html .= $data }
/* function PIHandler($parser, $target, $data) { //스위치(strtolower($target)){ // case "php": eval($data); // break; //} }*/
function parser() { $this->xml_parser = xml_set_object($this->xml_parser, & $this); // $map_array에서 태그를 찾을 수 있도록 대소문자 구분을 사용합니다.
xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($this->xml_parser, "startElement", "endElement"); xml_set_character_data_handler($this->xml_parser, "characterData");//xml_set_processing_instruction_handler($this->xml_parser, "PIHandler");
if (!($fp = fopen($this->xml_file, "r"))) { die("XML 입력을 열 수 없습니다."); } while ($data = fread($fp, 4096)) { if (!xml_parse($this->xml_parser, $data, feof($fp))) { die(sprintf("XML 오류: %s at line %d", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser))); } } }}
?>
---------------------------------- ---------------------------------
在这个类的构造函数中,我创建了打开与关闭两个标记数组。数组的关键字与我后face将要分析的标记是
一样的, 并且它们应的值包含格式化打开与关闭标记的HTML代码.
내가 정한 것은 义了一个简单的类析입니다构函数用来当我们不再需要它时释放XML 分析器。这个函数不得手不工调用,
因为PHP不支持当一个对象释放时자동으로 사용하는 것이 좋습니다.
然后我义了에서 XML文档中用来分析打开와关闭标记主回调방법입니다.对数据进行简单的格式化,后면我将向你演示如何将这些回调方法注册
到分析器中。
withstartElement and closeElement(当分析到一个打开或关闭标专时被分别调用)中使用 标记의 이름
작동索引键值对应的数组进行查询.如果那个键值存는 则返回值并且追加到类的'html'属性后面입니다.
'html'属性将나는 이것을 사용합니다.
characterData방식은 지역에 맞는 HTML 유형의 HTML 페이지입니다.
被注释起来적 PIHandler 방식은 一个回调函数,我还未曾实现它。如果它存가 话,它XML에서
文档中处理php脚本.
现재, 让我解释一下主要的分析方法的调用,你猜一猜,parse()!!!
第一行调了函数xml_parser_create(), xml_parser_create()를 사용하여 expat의 xml 분할 기능을 사용하여
성&this->xml_parser중.
다음으로 xml_set_object() 함수를 사용하여 클래스 메서드에 대한 콜백 함수를 등록해야 합니다.
저는 xml_set_object($this->xml_parser, &$this)와 같이 사용합니다. 첫 번째 매개변수에는
을 사용하여 XML 파서를 보유하는 클래스 특성을 지정한 다음 두 번째 매개변수에는 PHP 개체의 인스턴스 주소를 지정했습니다. 이를 통해 분석기는 등록될 모든
콜백이 해당 주소에 지정된 클래스의 실제 메서드임을 알 수 있습니다. 이는 c나 c의 '참조에 의한 전달'과 같습니다.
일부 사람들은 이를 단순히 '참조 변수'라고 부릅니다.
다음 줄에서는 대소문자 접기(대소문자
접기)를 사용하여 xml_parser_set_option()을 호출하여 xml 파서 속성을 설정합니다. 대소문자 구분은 XML 문서를 구문 분석할 때 대소문자 구분을 신경 쓰지 않는다는 사실을 파서에게 알립니다. 그러나
대소문자 구분을 사용하여 or 와 같은 두 개의 서로 다른 태그를 정의하려는 경우 이를 설정할 수 없습니다.
xml_set_element_handler()를 사용하여
"startElement" 및 "endElement"라는 시작 태그와 끝 태그에 대한 콜백 함수를 지정합니다.
다음으로 xml_set_character_data_handler()를 사용하여
characterData()라는 콜백 함수로 문자 데이터 처리 핸들러를 지정합니다. 주석이 달린 함수 호출인 xml_set_processing_instruction_handler(),
는 PIHandler() 함수를 등록하는 데 사용한 호출입니다. PIHandler는 XML 문서에 포함되어 PHP 코드를 처리할 수 있습니다.
나머지 코드는 단순히 XML 파일을 읽고 구문 분석합니다. 오류가 발생하면
오류가 발생한 행 번호를 포함하여 오류 세부 정보가 반환됩니다.
위에서는 Express Gate의 내용을 포함하여 Express Gate PHP와 XML: expat 함수 2를 사용하여 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.