使用PHP生成XML时遭遇‘EntityRef: expecting ;’错误,求解决方法
解决PHP生成XML时的‘EntityRef: expecting ;’错误
嘿,这个错误我太熟了——在PHP手动拼接XML时经常碰到,核心原因就是XML里的特殊字符没转义,让解析器误以为你要写实体引用(比如&),但却没写完分号,所以才抛出这个“EntityRef: expecting ;”的报错。
错误根源
XML有5个必须转义的特殊字符:
&(必须转成&)<(必须转成<)>(必须转成>)"(必须转成")'(必须转成')
比如你的XML里如果有类似FlightGroup的内容包含AT&T或者London&Paris这种字符串,直接写进去就会触发这个错误——解析器看到&就等着后面的实体名加分号,结果没找到,就炸了。
快速解决办法
1. 手动转义动态内容
如果是自己拼接XML字符串,一定要用PHP的htmlspecialchars()函数处理所有动态生成的内容,记得指定ENT_XML1参数(专门适配XML的转义规则):
// 假设$arrivalDesc是从数据库或用户输入来的动态内容 $safeArrivalDesc = htmlspecialchars($arrivalDesc, ENT_XML1, 'UTF-8'); // 再把转义后的内容拼进XML里 $xml .= "<ArrivalDesc>{$safeArrivalDesc}</ArrivalDesc>";
2. 用DOMDocument生成XML(更推荐)
手动拼接XML很容易踩坑,换成DOMDocument的话,它会自动帮你处理转义,完全不用操心特殊字符的问题:
// 初始化DOM文档 $dom = new DOMDocument('1.0', 'UTF-8'); $dom->formatOutput = true; // 格式化输出,方便阅读 // 创建根节点 $loggedErrors = $dom->createElement('LoggedErrors'); $dom->appendChild($loggedErrors); // 创建LoggedError节点 $loggedError = $dom->createElement('LoggedError'); $loggedErrors->appendChild($loggedError); // 添加DateTime节点 $dateTime = $dom->createElement('DateTime', '2018-03-30T10:28:28+00:00'); $loggedError->appendChild($dateTime); // 处理带特殊字符的动态内容 $flightNote = "Flight from NY & LA"; $flightGroup = $dom->createElement('FlightGroup'); $flightGroup->appendChild($dom->createTextNode($flightNote)); $loggedError->appendChild($flightGroup); // 输出XML echo $dom->saveXML();
这种方式不仅能避免转义错误,还能保证XML结构的合法性,不会出现标签未闭合的问题。
3. 检查XML片段的省略部分
你给出的XML里有<...的省略内容,要确认这部分有没有残留的特殊字符、未闭合的标签,或者不小心拼进去的PHP变量输出,这些都可能触发报错。
排查小技巧
把生成的XML输出到本地文件或者浏览器里,直接查看报错位置附近的内容——通常能一眼找到未转义的&或者其他特殊字符,定位问题就快多了。
内容的提问来源于stack exchange,提问作者Vishal Thakur
相关产品推荐
相关产品推荐

