它将说明如何外部实体指向处理器来包含和解析其它文档,如何处理 pis,以及一种确定包含有 pis 的代码的可信度。
能被该范例使用的的 xml 文档(xmltest.xml 和 xmltest2.xml)被列在该范例之后。
外部实体范例
$v\;
}
}
print >;
}
function endelement($parser, $name) {
print $name>;
}
function characterdata($parser, $data) {
print $data;
}
function pihandler($parser, $target, $data) {
switch (strtolower($target)) {
case php:
global $parser_file;
// if the parsed document is trusted, we say it is safe
// to execute php code inside it. if not, display the code
// instead.
if (trustedfile($parser_file[$parser])) {
eval($data);
} else {
printf(untrusted php code: %s,
htmlspecialchars($data));
}
break;
}
}
function defaulthandler($parser, $data) {
if (substr($data, 0, 1) == & && substr($data, -1, 1) == ;) {
printf('%s',
htmlspecialchars($data));
} else {
printf('%s',
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);
}
print
;
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)));
}
}
print
;
print parse complete\n;
xml_parser_free($xml_parser);
?>
xmltest.xml
]>
title &plainentity;
a1b1c1
a2c2
a3b3c3
&systementity;
about this document
以下文档将被 xmltest.xml 文件调用: xmltest2.xml
]>
&testent;
