PHP标签不能直接写入XML文档,否则会导致解析失败;正确做法分两种:一是用DOMDocument、XMLWriter或SimpleXMLElement动态生成并自动转义内容;二是用CDATA包裹PHP代码字符串以保留原样。

一、想在生成 XML 时动态插入 PHP 变量值
这是最常见需求:用 PHP 拼出合法 XML,其中内容由 PHP 计算得出。
- 用 DOMDocument:调用
createTextNode()或createCDATASection()插入变量值,不要直接拼字符串 - 用 XMLWriter:调用
xmlwriter_text()或xmlwriter_write_cdata() - 用 SimpleXMLElement:直接传变量给
addChild('tag', $value),它会自动转义特殊字符
✅ 正确示例(DOM):
$dom = new DOMDocument('1.0', 'UTF-8');
$item = $dom->createElement('content');
$item->appendChild($dom->createTextNode($userInput)); // 自动转义 <, >, & 等
$root->appendChild($item);
二、想让 XML 文件里“看起来像”有 PHP 标签(比如用于模板或预处理)
这时你不是在运行 PHP,而是在生成一段**纯文本内容**,恰好包含 <?php ... ?> 字符串。
- 必须用 CDATA 区块包裹,否则
会被 XML 解析器误认为是处理指令开头 - 或者对
和 <code>?手动实体化:<?php echo $x; ?>
✅ 正确示例(CDATA):
立即学习“PHP免费学习笔记(深入)”;
$cdata = $dom->createCDATASection('<?php echo "hello"; ?>');
$scriptNode = $dom->createElement('script');
$scriptNode->appendChild($cdata);
$root->appendChild($scriptNode);
输出效果:<script><![CDATA[<?php echo "hello"; ?>]]></script> —— 浏览器或解析器会原样保留这段文字,不执行。
三、千万别这么干(常见错误)
- 在 XML 字符串里直接写
<?php echo $x; ?>→ XML 解析器报错或截断 - 用
echo "<?xml... ";拼接时混入未转义的用户输入 → 引发 XML 结构破坏或 XSS 风险 - 把 PHP 文件后缀改成 .xml 并期望服务器执行 PHP → 大多数 Web 服务器不会解析 .xml 文件里的 PHP
四、如果真要“执行 PHP 再输出 XML”
那就保持文件为 .php 后缀,设置好响应头,然后输出合法 XML:
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<data><time>'.date('Y-m-d').'</time></data>'; // PHP 动态生成内容
此时浏览器收到的是标准 XML,但背后由 PHP 实时计算——这才是安全又标准的做法。



















