如何修复PHP中DOMDocument::validate()读取非标准SVG文件时出现的缺少DTD命名空间声明错误?
如何修复PHP中DOMDocument::validate()读取非标准SVG文件时出现的缺少DTD命名空间声明错误?
我之前处理CorelDraw/Inkscape导出的SVG时,也踩过这个坑!这些设计软件导出的SVG经常带一些非标准的DTD声明或者截断的属性,刚好撞上PHP的DOMDocument::validate()的严格校验规则,直接就报“缺少DTD命名空间声明”这类错误。
先看看你贴的CorelDraw导出的SVG头(应该是截断了,我补全了常见的结尾):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!-- Creator: CorelDRAW 2021 (64-Bit) --> <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100.0000mm" height="100.0000mm" version="1.1">
错误根源主要有两个:一是DOMDocument::validate()会强制校验DTD,而PHP默认会尝试加载外部DTD文件,很容易因为网络、权限或者DTD与命名空间不匹配报错;二是设计软件导出的SVG可能有属性截断、非标准注释干扰校验的情况。
给你几个亲测有效的解决办法:
关闭外部DTD加载,避免实体解析错误
PHP的libxml默认会加载外部实体,这不仅容易报错,还存在安全风险。直接禁用或者拦截外部实体加载:// 禁用外部实体加载 libxml_disable_entity_loader(true); // 或者自定义加载器,直接返回空内容 libxml_set_external_entity_loader(function ($public, $system, $context) { return fopen('php://memory', 'r'); }); $dom = new DOMDocument(); $dom->loadXML($svgContent); // 现在再执行validate()试试 $isValid = $dom->validate();预处理SVG内容,修正非标准部分
很多时候错误是因为SVG的属性截断(比如你贴的内容里versi明显是version的截断)或者DTD与命名空间的绑定问题,先手动修正:$svgContent = file_get_contents('your-coreldraw-svg.svg'); // 补全截断的version属性 $svgContent = preg_replace('/versi(?:on)?\s*=\s*"?/', 'version="1.1" ', $svgContent); // 移除可能干扰校验的非标准注释或声明(可选) $svgContent = preg_replace('/<!--.*?-->/s', '', $svgContent); $dom = new DOMDocument(); $dom->loadXML($svgContent);放宽校验规则,跳过严格的DTD校验
如果你不需要100%的DTD合规性,其实可以不用validate(),改用libxml的错误捕获机制做基础语法校验:libxml_use_internal_errors(true); // 开启内部错误捕获,不直接抛出 $dom = new DOMDocument(); $dom->recover = true; // 开启恢复模式,解析错误时尽量继续 $dom->loadXML($svgContent); // 检查是否有严重错误 $errors = libxml_get_errors(); if (!empty($errors)) { foreach ($errors as $error) { // 这里可以根据错误级别处理,比如只关注FATAL级别的错误 if ($error->level === LIBXML_ERR_FATAL) { echo "SVG解析错误: " . $error->message; } } libxml_clear_errors(); } else { // 正常处理SVG内容 }
我自己处理这类问题时,通常是先预处理SVG内容补全缺失的属性,再关闭外部实体加载,基本就能让validate()正常通过,你可以根据自己的需求选对应的方法。
内容来源于stack exchange
相关产品推荐
相关产品推荐

