You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用DOM创建XML时nodeValue大于号被转义为>的问题

问题本质

PHP DOMDocument 自动将文本节点中的>转义为>是符合W3C XML规范的标准行为,不是bug。所有合规的XML解析器读取节点值时,都会自动将>还原为原始的>,不会影响程序读取、业务使用。
如果是查看XML源文件时希望直接显示未转义的>,或是对接的第三方系统不兼容标准XML转义规则,就不能直接给nodeValue属性赋值——直接赋值时DOM会自动对所有特殊字符做实体转义,这也是之前尝试htmlspecialchars()、调用nodeTextValue属性都无法解决问题的原因:htmlspecialchars()本身就是用来生成转义实体的,会导致多重转义;DOMDocument没有nodeTextValue这个属性,属于用法错误。

修复方案

用CDATA节点包裹包含特殊字符的文本内容,CDATA段内的所有内容都会被XML解析器识别为普通文本,不会做任何转义。只需替换原代码中给$category->nodeValue赋值的那一行即可,其余代码无需改动:

$category = $dom->createElement('category');
$category->setAttribute('id', '63');
// 原问题行:$category->nodeValue='Foot>Ordinary foot';
// 替换为以下CDATA写入逻辑
$categoryText = $dom->createCDATASection('Foot>Ordinary foot');
$category->appendChild($categoryText);

生成的XML对应节点会变成如下格式,源文件中可以直接看到未转义的>:

<category id="63"><![CDATA[Foot>Ordinary foot]]></category>

补充提示:如果没有特殊要求,保留&gt;的标准转义写法兼容性更好,CDATA写法仅建议在对接非规范第三方系统、明确要求不转义特殊字符时使用。

内容的提问来源于stack exchange,提问作者user15940496

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:57:14