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>
补充提示:如果没有特殊要求,保留
>的标准转义写法兼容性更好,CDATA写法仅建议在对接非规范第三方系统、明确要求不转义特殊字符时使用。
内容的提问来源于stack exchange,提问作者user15940496
相关产品推荐
相关产品推荐

