您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP扩展之XML操作(三)——XML解析器使用及相关函数

2024/6/29 10:23:01发布23次查看
一、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 "$name\n"; $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 文档位于此例程的下方( 和 )。
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 "&lt;<font color=\"#0000cc\">$name</font>"; if (count($attribs)) { foreach ($attribs as $k => $v) { echo " <font color=\"#009900\">$k</font>=\"<fontcolor=\"#990000\">$v</font>\"";}} echo "&gt;"; } function endelement($parser, $name){ echo "&lt;/<font color=\"#0000cc\">$name</font>&gt;"; } 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 %s\n", $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 %s\n",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 %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));}} echo "</pre>";echo "parse complete\n"; 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>
此文件包含在 中:
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 — 建立未解析实体定义声明处理器
以上就是以上就是的内容。的内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product