澳门新葡萄京官网首页PHP 和 XML: 使用expat函数(二)

 PHP 和 XML: 使用expat函数(二)
  让大家看一下实际管理这一个文书档案的PHP代码。

PHP 和 XML: 使用expat函数(二State of Qatar 让我们看一下实际上管理这几个文书档案的PHP代码。
/*NewsBoy : News system for the web written in PHP by Justin Grant
(Web: jusgrant.cjb.net or justin.host.za.net Mail:
justin@glendale.net)25 March V0.0.2 Converted Newsboy to a PHP class,
allowing the layout to be easily modified. Also added made the HTML that
is genrated a little easier to read.24 March V0.0.1 Just completed the
intial version, very rough and basic.*/ class newsboy { var
$xml_parser; var $xml_file; var $html; var $open_tag ; var
$close_tag ; //Class Constructor function newsboy() { $this-xml_parser
= ; $this-xml_file = ; $this-html = ; $this-open_tag = array( //these
are the default settings but they are quite easy to modify NEWSBOY = nn,
STORY = , DATE = , SLUG = , TEXT = , PIC = , NEWLINE = );
$this-close_tag = array( NEWSBOY = nnn, STORY = , DATE = , SLUG = ,
TEXT = n, PIC = ); } //Class Destructor (has to be invoked manually as
PHP does not support destructors) function destroy() {
xml_parser_free($this-xml_parser); } //Class Members function
concat($str) { $this-html .= $str; } function startElement($parser,
$name, $attrs) { //global $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) { //switch (strtolower($target)){ //
case php: eval($data); // break; /

/*NewsBoy : News system for the web written in PHP by Justin Grant
(Web: jusgrant.cjb.net or justin.host.za.net Mail:
justin@glendale.net)25 March V0.0.2 Converted Newsboy to a PHP class,
allowing the layout to be easily modified. Also added made the HTML that
is genrated a little easier to read.24 March V0.0.1 Just completed the
intial version, very rough and basic.*/
class newsboy { var $xml_parser; var $xml_file; var $html; var
$open_tag ; var $close_tag ;
//Class Constructor
function newsboy() { $this->xml_parser = “”; $this->xml_file =
“”; $this->html = “”; $this->open_tag = array(
//these are the default settings but they are quite easy to modify
“NEWSBOY” => “nn”, “STORY” => ” “, “DATE” => “”, “SLUG” => ”
“, “TEXT” => “”, “PIC” => “”, “NEWLINE” => “” );
$this->close_tag = array( “NEWSBOY” => “
nnn”, “STORY” => “”, “DATE” => “”, “SLUG” => “
“, “TEXT” => “n”, “PIC” => ” “
” ); }
//Class Destructor (has to be invoked manually as PHP does not support
destructors)

function destroy() { xml_parser_free($this->xml_parser); }
//Class Members
function concat($str) { $this->html .= $str; }
function startElement($parser, $name, $attrs) { //global $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) { //switch
(strtolower($target)){ // case “php”: eval($data); // break; //} }*/
function parse() { $this->xml_parser = xml_parser_create();
xml_set_object($this->xml_parser, &$this); // use case-folding so
we are sure to find the tag in $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(“could not open XML
input”); } while ($data = fread($fp, 4096)) { if
(!xml_parse($this->xml_parser, $data, feof($fp))) {
die(sprintf(“XML error: %s at line %d”,
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser))); } } }}
?>


  在这里个类的布局函数中,小编创造了开采与关闭八个暗号数组。数组的基本点字与自己背后将在解析的符号是
相仿的,并且它们相应的值包涵格式化张开与关闭标志的HTML代码。

  我定义了八个简便的类析构函数用来当我们不再必要它时释放XML
解析器。那么些函数必须要手工业调用,
因为PHP不协助当叁个对象释放时自动调用类的析构函数。

  然后自个儿定义了在XML文书档案中用来剖析展开和停业标志的主回调方法。笔者也定义了多少个数目分析方法,

用来当打开和关闭标志中有数量时,对数码实行简易的格式化,后边我将向您演示如何将那一个回调方法注册
到深入分析器中。

  在startElement和closeElement(当深入分析到三个张开或关闭标专时被分级调用State of Qatar中选取标志的名字
用作索引键值对相应的数组实行查询。如若那多少个键值存在,则重临值并且增至类的’html’
属性的末端。
‘html’属性就要之后大家确实展现文书档案内容的时候使用。

  characterData方法简便地将标识之间的值加到类的html属性的前面。

  被批注起来的叫PIHandler的格局是三个回调函数,作者还不曾实现它。假如它存在的话,它将间接在XML
文书档案中拍卖php脚本。

  以后,让自家解释一下首要的剖析方法的调用,你猜意气风发猜,parse(State of Qatar!!!

  第意气风发行调用了函数xml_parser_create(State of Qatar,它将再次来到叁个expat的xml剖析器的实例,并且被封存在类的
属性&this->xml_parser中。

  下一步,大家需求用函数xml_set_object(卡塔尔国来注册三个类情势的回调函数。

  小编是如此使用的,xml_set_object($this->xml_parser,
&$this卡塔尔。作者在率先个参数中钦命了用
来保存xml
深入分析器的类属性,然后在第四个参数,作者钦定了PHP对象的实例地址。那一个能够让剖析器
知道全
部将要注册的回调函数,是在足够地点上钦点类的实在的秘技。那就象c或c++中的贰个’援引传递’,也有人
粗略地叫做’援引变量’。

  在下后生可畏行,笔者调用了xml_parser_set_option(卡塔尔国设置了多个xml深入分析器的性质,使用大小写折叠(
case
folding卡塔尔国。大小写折叠只是告诉解析器知道,当自家剖析作者的XML文档时本人并不关怀大小写敏感,不过固然您
想行使大小写敏感来定义三个例外的符号,如或,你能够不安装它。

  通过接受xml_set_element_handler(卡塔尔,笔者内定了用于最初和结束标识的回调函数,名字是
“startElement”和”endElement”。

  接着,我使用xml_set_character_data_handler(State of Qatar来钦点字符数据的拍卖句柄为名叫
characterData(卡塔尔的回调函数。被批注的函数调用,xml_set_processing_instruction_handler(),
是三个自己用来注册函数
PIHandler(State of Qatar的调用。PIHandler能够被回顾在XML文书档案中拍卖php代码。

  其余的代码只是很简短地读XML文件同一时候解析它。借使贰个错误爆发,那么错误明细将回来,包含错误
爆发的行号。  

发表评论

电子邮件地址不会被公开。 必填项已用*标注