PHP 的 XML Expat 解析器是一种基于事件的流式解析器,适合处理大型 XML 文件或需要高效内存使用的场景。以下是其 功能、用法及运用详解:
xml
扩展提供接口,性能较高。$parser = xml_parser_create();
// 可选:设置编码(默认 UTF-8)
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
需为以下事件注册处理函数:
// 开始标签回调
function startElement($parser, $name, $attrs) {
echo "开始标签: $namen";
// $attrs 是属性数组,如 ["id" => "123"]
}
// 结束标签回调
function endElement($parser, $name) {
echo "结束标签: $namen";
}
// 文本内容回调
function characterData($parser, $data) {
echo "文本内容: $datan";
}
// 错误处理回调
function errorHandler($parser, $errorCode, $errorMessage) {
die("XML 错误: $errorMessage");
}
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
xml_set_default_handler($parser, "errorHandler"); // 处理未定义事件
// 解析字符串
xml_parse($parser, $xmlString);
// 解析文件
xml_parse($parser, file_get_contents("data.xml"));
// 释放解析器资源
xml_parser_free($parser);
// 创建解析器
$parser = xml_parser_create();
// 定义回调函数
function startElement($parser, $name, $attrs) {
global $currentTag;
$currentTag = $name;
echo "开始标签: $namen";
if (!empty($attrs)) {
echo "属性: " . json_encode($attrs) . "n";
}
}
function endElement($parser, $name) {
echo "结束标签: $namen";
}
function characterData($parser, $data) {
global $currentTag;
$data = trim($data);
if (!empty($data)) {
echo "标签 $currentTag 的内容: $datan";
}
}
// 绑定回调
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// 解析 XML
$xml = 'PHP Guide 49.99 ';
xml_parse($parser, $xml);
// 释放资源
xml_parser_free($parser);
输出:
开始标签: book
属性: {"id":"101"}
开始标签: title
标签 title 的内容: PHP Guide
结束标签: title
开始标签: price
标签 price 的内容: 49.99
结束标签: price
结束标签: book
跟踪嵌套标签
使用栈(array
)保存当前标签路径:
$tagStack = [];
function startElement($parser, $name, $attrs) {
global $tagStack;
array_push($tagStack, $name);
echo "当前路径: " . implode(" → ", $tagStack) . "n";
}
function endElement($parser, $name) {
global $tagStack;
array_pop($tagStack);
}
处理 CDATA 或特殊字符
使用 xml_set_default_handler
捕获未定义事件。
错误处理增强
获取详细错误信息:
if (!xml_parse($parser, $xml)) {
$errorCode = xml_get_error_code($parser);
$errorMsg = xml_error_string($errorCode);
die("解析失败: $errorMsg (行号: " . xml_get_current_line_number($parser) . ")");
}
解析器 | 类型 | 内存占用 | 适用场景 |
---|---|---|---|
Expat | 流式 | 低 | 大型文件、实时解析 |
DOM | 树形 | 高 | 需要频繁查询/修改 XML 结构 |
SimpleXML | 树形 | 中 | 简单 XML 读写 |
通过合理使用 Expat 解析器,可以在 PHP 中高效处理 XML 数据,尤其适合资源敏感或大规模数据场景。
参与评论
手机查看
返回顶部