PHP擴展之XML操作(三)——XML解析器使用及相關函數
第一個例程縮進顯示文檔中的開始元素結構。
Example #1 顯示 XML 元素結構
<?php$file?=?'data.xml';$depth?=?array();function?startElement($parser,?$name,?$attrs){global?$depth;for?($i?=?0;?$i?<?$depth[$parser];?$i++)?{echo?'??';}echo?'$namen';$depth[$parser]++;}
function?endElement($parser,?$name){global?$depth;$depth[$parser]--;}
$xml_parser?=?xml_parser_create();xml_set_element_handler($xml_parser,?'startElement',?'endElement');if?(!($fp?=?fopen($file,?'r')))?{die('could?not?open?XML?input');}
while?($data?=?fread($fp,?4096))?{if?(!xml_parse($xml_parser,?$data,?feof($fp)))?{die(sprintf('XML?error:?%s?at?line?%d',xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));}}xml_parser_free($xml_parser);?>二、XML 標簽映射例程
Example #1 將 XML 映射為 HTML
此例程直接地將 XML 標簽映射為 HTML 標簽。 在“map_array”中未找到的元素將被忽略。 當然,此例程只針對特定的 XML 文檔類型起作用。
<?php$file?=?'data.xml';$map_array?=?array('BOLD'?????=>?'B','EMPHASIS'?=>?'I','LITERAL'??=>?'TT');function?startElement($parser,?$name,?$attrs){global?$map_array;if?(isset($map_array[$name]))?{echo?'<$map_array[$name]>';}}
function?endElement($parser,?$name){global?$map_array;if?(isset($map_array[$name]))?{echo?'</$map_array[$name]>';}}
function?characterData($parser,?$data){echo?$data;}
$xml_parser?=?xml_parser_create();//?use?case-folding?so?we?are?sure?to?find?the?tag?in?$map_arrayxml_parser_set_option($xml_parser,?XML_OPTION_CASE_FOLDING,?true);xml_set_element_handler($xml_parser,?'startElement',?'endElement');xml_set_character_data_handler($xml_parser,?'characterData');if?(!($fp?=?fopen($file,?'r')))?{die('could?not?open?XML?input');}
while?($data?=?fread($fp,?4096))?{if?(!xml_parse($xml_parser,?$data,?feof($fp)))?{die(sprintf('XML?error:?%s?at?line?%d',xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));}}xml_parser_free($xml_parser);?>三、XML 外部實體例程
此例程用于加亮 XML 代碼。舉例說明如何使用外部實體引用來包含和解析其他文檔, 及處理指令是如何被處理的,及判斷處理指令所包含代碼是否“可信任”的一種方法
用于此例程的 XML 文檔位于此例程的下方(xmltest.xml?和?xmltest2.xml)。
Example #1 外部實體例程
<?php$file?=?'xmltest.xml';function?trustedFile($file){//?僅信任本地文件if?(!preg_match('@^([a-z]+)://@i',?$file)&&?fileowner($file)?==?getmyuid())?{return?true;}return?false;}
function?startElement($parser,?$name,?$attribs){echo?'<<font?color='#0000cc'>$name</font>';if?(count($attribs))?{foreach?($attribs?as?$k?=>?$v)?{echo?'?<font?color='#009900'>$k</font>='<fontcolor='#990000'>$v</font>'';}}echo?'>';}
function?endElement($parser,?$name){echo?'</<font?color='#0000cc'>$name</font>>';}
function?characterData($parser,?$data){echo?'<b>$data</b>';}
function?PIHandler($parser,?$target,?$data){switch?(strtolower($target))?{case?'php':global?$parser_file;//?如何要解析的文檔是“可信任”的,?則說明可安全//?地執行其內部的?PHP?代碼。否則,顯示代碼內容。if?(trustedFile($parser_file[$parser]))?{eval($data);}?else?{printf('Untrusted?PHP?code:?<i>%s</i>',htmlspecialchars($data));}break;}}
function?defaultHandler($parser,?$data){if?(substr($data,?0,?1)?==?'&'?&&?substr($data,?-1,?1)?==?';')?{printf(’<font?color='#aa00aa'>%s</font>’,htmlspecialchars($data));}?else?{printf(’<font?size='-1'>%s</font>’,htmlspecialchars($data));}}
function?externalEntityRefHandler($parser,?$openEntityNames,?$base,?$systemId,$publicId)?{if?($systemId)?{if?(!list($parser,?$fp)?=?new_xml_parser($systemId))?{printf('Could?not?open?entity?%s?at?%sn',?$openEntityNames,$systemId);return?false;}while?($data?=?fread($fp,?4096))?{if?(!xml_parse($parser,?$data,?feof($fp)))?{printf('XML?error:?%s?at?line?%d?while?parsing?entity?%sn',xml_error_string(xml_get_error_code($parser)),xml_get_current_line_number($parser),?$openEntityNames);xml_parser_free($parser);return?false;}}xml_parser_free($parser);return?true;}return?false;}
function?new_xml_parser($file){global?$parser_file;
$xml_parser?=?xml_parser_create();xml_parser_set_option($xml_parser,?XML_OPTION_CASE_FOLDING,?1);xml_set_element_handler($xml_parser,?'startElement',?'endElement');xml_set_character_data_handler($xml_parser,?'characterData');xml_set_processing_instruction_handler($xml_parser,?'PIHandler');xml_set_default_handler($xml_parser,?'defaultHandler');xml_set_external_entity_ref_handler($xml_parser,?'externalEntityRefHandler');
if?(!($fp?=?@fopen($file,?'r')))?{return?false;}if?(!is_array($parser_file))?{settype($parser_file,?'array');}$parser_file[$xml_parser]?=?$file;return?array($xml_parser,?$fp);}
if?(!(list($xml_parser,?$fp)?=?new_xml_parser($file)))?{die('could?not?open?XML?input');}
echo?'<pre>';while?($data?=?fread($fp,?4096))?{if?(!xml_parse($xml_parser,?$data,?feof($fp)))?{die(sprintf('XML?error:?%s?at?line?%dn',xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));}}echo?'</pre>';echo?'parse?completen';xml_parser_free($xml_parser);
?>
Example #2 xmltest.xml
<?xml version=’1.0’?><!DOCTYPE chapter SYSTEM '/just/a/test.dtd' [<!ENTITY plainEntity 'FOO entity'><!ENTITY systemEntity SYSTEM 'xmltest2.xml'>]><chapter> <TITLE>Title &plainEntity;</TITLE> <para> <informaltable> <tgroup cols='3'> <tbody> <row><entry>a1</entry><entry morerows='1'>b1</entry><entry>c1</entry></row> <row><entry>a2</entry><entry>c2</entry></row> <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row> </tbody> </tgroup> </informaltable> </para> &systemEntity; <section id='about'> <title>About this Document</title> <para> <!-- this is a comment --> <?php echo ’Hi! This is PHP version ’ . phpversion(); ?> </para> </section></chapter>
此文件包含在?xmltest.xml?中:
Example #3 xmltest2.xml
<?xml version='1.0'?><!DOCTYPE foo [<!ENTITY testEnt 'test entity'>]><foo> <element attrib='value'/> &testEnt; <?php echo 'This is some more PHP code being executed.'; ?></foo>四、XML解析器函數utf8_decode?— 將用 UTF-8 方式編碼的 ISO-8859-1 字符串轉換成單字節的 ISO-8859-1 字符串。utf8_encode?— 將 ISO-8859-1 編碼的字符串轉換為 UTF-8 編碼xml_error_string?— 獲取 XML 解析器的錯誤字符串xml_get_current_byte_index?— 獲取 XML 解析器的當前字節索引xml_get_current_column_number?— 獲取 XML 解析器的當前列號xml_get_current_line_number?— 獲取 XML 解析器的當前行號xml_get_error_code?— 獲取 XML 解析器錯誤代碼xml_parse_into_struct?— 將 XML 數據解析到數組中xml_parse?— 開始解析一個 XML 文檔xml_parser_create_ns?— 生成一個支持命名空間的 XML 解析器xml_parser_create?— 建立一個 XML 解析器xml_parser_free?— 釋放指定的 XML 解析器xml_parser_get_option?— 從 XML 解析器獲取選項設置信息xml_parser_set_option?— 為指定 XML 解析進行選項設置xml_set_character_data_handler?— 建立字符數據處理器xml_set_default_handler?— 建立默認處理器xml_set_element_handler?— 建立起始和終止元素處理器xml_set_end_namespace_decl_handler?— 建立終止命名空間聲明處理器xml_set_external_entity_ref_handler?— 建立外部實體指向處理器xml_set_notation_decl_handler?— 建立注釋聲明處理器xml_set_object?— 在對象中使用 XML 解析器xml_set_processing_instruction_handler?— 建立處理指令(PI)處理器xml_set_start_namespace_decl_handler?— 建立起始命名空間聲明處理器xml_set_unparsed_entity_decl_handler?— 建立未解析實體定義聲明處理器
相關文章:
