PHP基础教程:XML 解析函数库

发布时间:2007年03月13日      浏览次数:1680 次
XML (eXtensible Markup Language) 是一种资料文件转换的标准。详情请参考 http://www.w3.org/XML。
要使用本函数库,需先到 http://www.jclark.com/xml 取回 XML 的函数库,并且编译或安装。用 RedHat Linux 的用户可以到 http://www.guardian.no/~ssb/phpxml.html 取得 RPM 的格式档。之后要在编译 PHP 前加入 --with-xml 的配置选项。tommy@nashville.net 指出 (12-Jan-1999) 若有问题,尚需在 /usr/local/include 放入 xmltok.h 及 xmlparse.h 二个 C 语言的标头档,或是设好环境变量。
目前的版本支持三种字符集:US-ASCII、ISO-8859-1 与 UTF-8。至于 UTF-16 字符集 PHP 尚未支持。
XML 有许多错误代码,如下
XML_ERROR_NONE
XML_ERROR_NO_MEMORY
XML_ERROR_SYNTAX
XML_ERROR_NO_ELEMENTS
XML_ERROR_INVALID_TOKEN
XML_ERROR_UNCLOSED_TOKEN
XML_ERROR_PARTIAL_CHAR
XML_ERROR_TAG_MISMATCH
XML_ERROR_DUPLICATE_ATTRIBUTE
XML_ERROR_JUNK_AFTER_DOC_ELEMENT
XML_ERROR_PARAM_ENTITY_REF
XML_ERROR_UNDEFINED_ENTITY
XML_ERROR_RECURSIVE_ENTITY_REF
XML_ERROR_ASYNC_ENTITY
XML_ERROR_BAD_CHAR_REF
XML_ERROR_BINARY_ENTITY_REF
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF
XML_ERROR_MISPLACED_XML_PI
XML_ERROR_UNKNOWN_ENCODING
XML_ERROR_INCORRECT_ENCODING
XML_ERROR_UNCLOSED_CDATA_SECTION
XML_ERROR_EXTERNAL_ENTITY_HANDLING
和中文有关的信息可在中央研究院的 Chinese XML Now 网站看到。而和 XML 有关的术语则使用曾士熊先生所译的 SGML 名词英汉翻译表。
xml_parser_create: 初始 XML 解析器。
xml_set_object: 使 XML 解析器用类。
xml_set_element_handler: 配置元素的标头。
xml_set_character_data_handler: 建立字符资料标头。
xml_set_processing_instruction_handler: 建立处理指令标头。
xml_set_default_handler: 建立默认标头。
xml_set_unparsed_entity_decl_handler: 配置未解析实体宣告的标头。
xml_set_notation_decl_handler: 配置记法宣告的标头。
xml_set_external_entity_ref_handler: 配置外部实体参引的标头。
xml_parse: 解析 XML 文件。
xml_get_error_code: 取得 XML 错误码。
xml_error_string: 取得 XML 错误字符串。
xml_get_current_line_number: 取得目前解析的行号。
xml_get_current_column_number: 获知目前解析的第几字段。
xml_get_current_byte_index: 取得目前解析为第几个位组。
xml_parser_free: 释放解析占用的内存。
xml_parser_set_option: 配置解析使用的选项。
xml_parser_get_option: 取得解析使用的选项。
utf8_decode: 将 UTF-8 码转成 ISO-8859-1 码。
utf8_encode: 将 ISO-8859-1 码转成 UTF-8 码。
xml_parser_create
初始 XML 解析器。
语法: int xml_parser_create(string [encoding]);
返回值: 整数
函数种类: 资料处理
内容说明: 本函数用来初始化一个新的 XML 解析器。参数 encoding 可省略,为 XML 使用的字符集,默认值为 ISO-8859-1,其它尚有 US-ASCII、UTF-8 二种。成功则返回 parser 代码供其它函数使用,失败则返回 false 值。
xml_set_object
使 XML 解析器用类。
语法: void xml_set_object(int parser, object &object);
返回值: 无
函数种类: 资料处理
内容说明: 本函数让解析器能使用类的方式,值得注意的是这个函数在 PHP 4.0 以上的版本才可使用。参数 parser 为 xml_parser_create() 所返回的解析代码。参数 &object 是类本身的指针。
使用范例
<?php
class xml {
var $parser;
function xml() {
$this->parser = xml_parser_create();
xml_set_object($this->parser,&$this);
xml_set_element_handler($this->parser,"tag_open","tag_close");
xml_set_character_data_handler($this->parser,"cdata");
}
function parse($data) {
xml_parse($this->parser,$data);
}
function tag_open($parser,$tag,$attributes) {
var_dump($parser,$tag,$attributes);
}
function cdata($parser,$cdata) {
var_dump($parser,$cdata);
}
function tag_close($parser,$tag) {
var_dump($parser,$tag);
}
} // end of class xml
$xml_parser = new xml();
$xml_parser->parse("<A ID=\"hallo\">PHP</A>");
?>
xml_set_element_handler
配置元素的标头。
语法: boolean xml_set_element_handler(int parser, string startElementHandler, string endElementHandler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置元素的标头供 xml_parse() 函数使用。参数 parser 为解析代码。参数 startElementHandler 及 endElementHandler 分别为元素开始与结束的标头,其中的 startElementHandler 必须包括解析代码、名称、与属性,而 endElementHandler 参数包括了解析代码及名称二个参数。若无错误则返回 true 值。
使用范例
下列用来显示 XML 元素结构 (Element Structure)
<?php
$file = "data.xml";
$depth = array();
function startElement($parser, $name, $attrs)
{
global $depth;
for ($i = 0; $i < $depth[$parser]; $i++) {
print " ";
}
print "$name\n";
$depth[$parser]++;
}
function endElement($parser, $name, $attrs)
{
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_set_character_data_handler
建立字符资料标头。
语法: boolean xml_set_character_data_handler(int parser, string handler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置字符资料的标头。参数 parser 为解析代码。参数 handler 包括解析代码及资料字符串等二个元素。若无错误则返回 true 值。
xml_set_processing_instruction_handler
建立处理指令标头。
语法: boolean xml_set_processing_instruction_handler(int parser, string handler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置处理指令 (Processing Instruction, 简称 PI) 的标头,处理指令类似下列行的格式
<?target data?>
参数 parser 为解析代码。参数 handler 包括解析代码、处理指令目标及资料字符串等三个元素。若无错误则返回 true 值。
xml_set_default_handler
建立默认标头。
语法: boolean xml_set_default_handler(int parser, string handler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置默认的标头。参数 parser 为解析代码。参数 handler 包括解析代码及资料字符串等二个元素。若无错误则返回 true 值。
xml_set_unparsed_entity_decl_handler
配置未解析实体宣告的标头。
语法: boolean xml_set_unparsed_entity_decl_handler(int parser, string handler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置尚未经过解析的实体宣告标头。参数 parser 为解析代码。参数 handler 包括解析代码、实体名称、基底、系统识别符、公用识别符、与记法名称等六个元素。看起来应是类似如下的字符串
<!ENTITY name {publicId | systemId} NDATA notationName>
更多的细节可以参考 XML 1.0 的规格书,有关实体宣告的部份。若无错误则返回 true 值。
xml_set_notation_decl_handler
配置记法宣告的标头。
语法: boolean xml_set_notation_decl_handler(int parser, string handler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置记法宣告 (notation declaration) 的标头。参数 parser 为解析代码。参数 handler 包括解析代码、记法名称、基底、系统识别符、与公用识别符等五个元素。看起来应是类似如下的字符串
<!NOTATION name {systemId | publicId}>
更多的细节可以参考 XML 1.0 的规格书,有关 Notation 的部份。若无错误则返回 true 值。
xml_set_external_entity_ref_handler
配置外部实体参引的标头。
语法: boolean xml_set_external_entity_ref_handler(int parser, string handler);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数配置外部实体参引 (external entity reference) 的标头。参数 parser 为解析代码。参数 handler 包括解析代码、打开实体名称、基底、系统识别符、与公用识别符等五个元素。若标头有错,可用 xml_get_error_code() 会返回 XML_ERROR_EXTERNAL_ENTITY_HANDLING。若无错误则返回 true 值。
xml_parse
解析 XML 文件。
语法: boolean xml_parse(int parser, string data, int [isFinal]);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数用来解析 XML 格式的文件资料。参数 parser 为解析代码。参数 data 为解析的资料区块 (chunk)。参数 isFinal 可省略,若设为 true 则系统会自动送出最后的资料部分 (piece) 给 data 参数。若无错误则返回 true 值。
xml_get_error_code
取得 XML 错误码。
语法: int xml_get_error_code(int parser);
返回值: 整数
函数种类: 资料处理
内容说明: 本函数可取得 XML 在处理时的错误代码。参数 parser 为解析代码。若 parser 有错则返回 false 值,否则就返回错误代码 (如 XML_ERROR_BINARY_ENTITY_REF .... 等等)。
xml_error_string
取得 XML 错误字符串。
语法: string xml_error_string(int code);
返回值: 字符串
函数种类: 资料处理
内容说明: 本函数可取得 XML 在处理时的错误代码。参数 code 为解析错误代码。若无错误返回值为代码的文字描述字符串。
xml_get_current_line_number
取得目前解析的行号。
语法: int xml_get_current_line_number(int parser);
返回值: 整数
函数种类: 资料处理
内容说明: 本函数用来取得目前 XML 解析所正在处理的行号。参数 parser 为解析代码。若 parser 有错则返回 false 值,若无错误则返回行号数字。
xml_get_current_column_number
获知目前解析的第几字段。
语法: int xml_get_current_column_number(int parser);
返回值: 整数
函数种类: 资料处理
内容说明: 本函数用来取得目前 XML 解析所正在处理行的第几个字段。参数 parser 为解析代码。若 parser 有错则返回 false 值,若无错误则返回字段序数。
xml_get_current_byte_index
取得目前解析为第几个位组。
语法: int xml_get_current_column_number(int parser);
返回值: 整数
函数种类: 资料处理
内容说明: 本函数用来取得目前 XML 解析所正在的位组 (byte) 为第几个位组。参数 parser 为解析代码。若 parser 有错则返回 false 值,若无错误则返回位序号。
xml_parser_free
释放解析占用的内存。
语法: boolean xml_parser_free(int parser);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数用来释放目前 XML 解析所使用的内存。参数 parser 为解析代码。若没有错误则返回 true 值,否则返回 false 值。
xml_parser_set_option
配置解析使用的选项。
语法: boolean xml_parser_set_option(int parser, int option, mixed value);
返回值: 布尔值
函数种类: 资料处理
内容说明: 本函数用来配置 XML 解析所选用的选项。参数 parser 为解析代码。参数 option 即为欲配置的选项常量名称,见下表 (如: XML_OPTION_CASE_FOLDING)。参数 value 则为欲配置的值。若没有错误则返回 true 值,否则返回 false 值。
选项常量名称 类型 说明
XML_OPTION_CASE_FOLDING 整数 配置是否允许 case-folding,默认值为允许
XML_OPTION_TARGET_ENCODING 字符串 配置目地的编码类型,有 ISO-8859-1、US-ASCII 及 UTF-8 等
参考: xml_parser_get_option()
xml_parser_get_option
取得解析使用的选项。
语法: mixed xml_parser_get_option(int parser, int option);
返回值: 混合类型资料
函数种类: 资料处理
内容说明: 本函数用来取得 XML 解析所选用的选项。参数 parser 为解析代码。参数 option 即为欲取得的选项常量名称,有 XML_OPTION_CASE_FOLDING 及 XML_OPTION_TARGET_ENCODING 二种。
参考: xml_parser_set_option()
utf8_decode
将 UTF-8 码转成 ISO-8859-1 码。
语法: string utf8_decode(string data);
返回值: 字符串
函数种类: 资料处理
内容说明: 本函数用来将 UTF-8 内码转成 ISO-8859-1 内码。参数 data 为待转换的字符串。
参考 utf8_encode()
utf8_encode
将 ISO-8859-1 码转成 UTF-8 码。
语法: string utf8_decode(string data);
返回值: 字符串
函数种类: 资料处理
内容说明: 本函数用来将 ISO-8859-1 内码转成 UTF-8 内码。参数 data 为待转换的字符串。
参考: utf8_decode()
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!