xml_parser_get_option() 用于获取特定 XML 解析器的设置。函数原型如下:
mixed xml_parser_get_option(resource $parser, int $option)
其中 $parser 是通过 xml_parser_create() 或相关函数创建的解析器资源,$option 是你想要获取的选项常量,例如 XML_OPTION_TARGET_ENCODING、XML_OPTION_CASE_FOLDING 等。
如果设置项存在,函数返回其当前值;否则返回 false。
对于编码相关,最常用的选项是:
XML_OPTION_TARGET_ENCODING
此选项表示解析器输出的目标编码,它决定了解析器如何转换内部字符表示为 PHP 可用的字符串。默认值为 "UTF-8",也可以是 "ISO-8859-1" 或 "US-ASCII"。
xml_parser_get_option() 返回的是目标编码,即解析器输出结果的编码,而不是原始 XML 文件的编码。原始 XML 文件的编码由 XML 声明决定,例如:
<?xml version="1.0" encoding="ISO-8859-1"?>
即使 XML 声明是 ISO-8859-1,只要你没有手动更改解析器设置,xml_parser_get_option() 仍会返回 "UTF-8",因为 PHP 会将源内容自动转换为目标编码。
如果你打算修改默认目标编码,可以使用 xml_parser_set_option():
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
随后用 xml_parser_get_option() 验证是否设置成功:
$encoding = xml_parser_get_option($parser, XML_OPTION_TARGET_ENCODING);
echo "当前编码:$encoding";
请注意,不支持任意编码,设置为不被支持的编码会导致解析器失败。
如果读取的 XML 文件本身使用与目标编码不一致的字符集,且内容中含有非 ASCII 字符,PHP 的解析器可能会因字符无法映射而抛出错误。因此,确保源文件的实际编码与声明一致,并与目标编码兼容是非常关键的。
可以通过 mb_detect_encoding() 检测文件的原始编码,必要时用 mb_convert_encoding() 转换为目标编码:
$xml = file_get_contents("https://gitbox.net/data/sample.xml");
$xml = mb_convert_encoding($xml, "UTF-8", "auto");
$parser = xml_parser_create("UTF-8");
xml_parse($parser, $xml, true);
每个解析器实例是独立的,获取设置时请确保你传入的是正确的解析器资源。尤其在同时处理多个 XML 文件或在类中封装解析器逻辑时,这一点尤为重要。
xml_parser_get_option() 属于 Expat 解析器接口,而非基于 libxml 的 DOM 或 SimpleXML,因此无法用于这些扩展。它仅适用于使用 xml_parser_create() 创建的 SAX 风格解析器。