PHP XML解析器函数

PHP xml_set_unparsed_entity_decl_handler() 函数为给定的 XML 解析器设置未解析的实体声明处理函数。

如果 XML 解析器遇到带有 NDATA 声明的外部实体声明,则将调用处理程序,如下所示:

<!ENTITY <parameter>name</parameter> {<parameter>publicId</parameter> | <parameter>systemId</parameter>} 
 NDATA <parameter>notationName</parameter> 

语法

xml_set_unparsed_entity_decl_handler(parser, handler) 

参数

parse必需。 指定对 XML 解析器的引用,以设置未解析的实体声明处理函数。
handler必需。 指定一个字符串,其中包含要用作事件处理程序的函数名称。该函数必须接受六个参数:
handler(parser, entity_name, base, system_id, public_id, notation_name) 
  • parser:第一个参数 parser 是对调用处理程序的 XML 解析器的引用。
  • entity_name:即将定义的实体的名称。
  • base:解析符号声明的系统标识符(system_id)的基数。目前此参数将始终设置为空字符串。
  • system_id:外部实体的系统标识符。
  • public_id>:外部实体的公共标识符。
  • notation_name:包含此实体的符号名称的变量。
如果是处理函数设置为空字符串或 false,则禁用相关处理程序。注意:除了函数名称之外,还可以提供包含对象引用和方法名称的数组。

返回值

成功时返回 true,失败时返回 false。

示例:xml_set_unparsed_entity_decl_handler() 示例

假设我们有一个名为 test.xml 的文件。在下面的示例中,使用 xml_parser_create() 函数创建 XML 解析器。然后打开 XML 文件,使用字符处理函数 char_print 解析其数据。然后,unparsed_ent_handler 函数被设置为给定 XML 解析器的未解析实体声明处理函数。解析文档后,使用xml_parser_free()函数释放解析器。

<?php
//创建XML解析器
$parser=xml_parser_create();

//XML解析器的字符处理函数
function char_print($parser, $data) {
  echo $data;
}

//XML解析器的未解析实体声明处理函数
function unparsed_ent_handler($parser, $entname, $base, $sysID, $pubID, $notname) {
  echo "$entname $sysID $pubID $notname \n";
}

//设置XML解析器的字符处理函数
xml_set_character_data_handler($parser,"char_print");

//为XML解析器设置未解析的实体声明处理函数
xml_set_unparsed_entity_decl_handler($parser,"unparsed_ent_handler");

//打开xml文件
$fp = fopen("test.xml", "r");

while($data = fread($fp,4096)) {
  //解析XML数据
  xml_parse($parser,$data,feof($fp)) or

    //解析错误时显示错误
    die (sprintf("XML Error: %s at line %d",

    //错误字符串
    xml_error_string(xml_get_error_code($parser)),

    //当前行
    xml_get_current_line_number($parser)));
}

//免费的XML解析器
xml_parser_free($parser);

fclose($fp);
?>