我有一个php文件,它根据MySql db打印一个xml。
每次出现& 符号时,我都会收到错误。
这是一些php:
$query = mysql_query($sql);
$_xmlrows = '';
while ($row = mysql_fetch_array($query)) {
$_xmlrows .= xmlrowtemplate($row);
}
function xmlrowtemplate($dbrow){
return "<AD>
<CATEGORY>".$dbrow['category']."</CATEGORY>
</AD>
}
输出是我想要的,即文件输出正确的类别,但仍然给出错误。
错误说: xmlParseEntityRef:没有名字
然后它指向一个&amp; 符号的确切字符。
仅当$dbrow['category']
带有&amp; 符号时才会抱怨,例如:“汽车和卡车”或“< strong>电脑和电话“。
有人知道问题是什么吗?
BTW:我在所有文档中都将编码设置为UTF-8,以及xml输出。
答案 0 :(得分:42)
&
启动实体。由于您尚未定义实体&WhateverIsAfterThat
,因此会引发错误。你应该用&
转义它。
$string = str_replace('&', '&', $string);
How do I escape ampersands in XML
要转义其他保留字符:
function xmlEscape($string) {
return str_replace(array('&', '<', '>', '\'', '"'), array('&', '<', '>', ''', '"'), $string);
}
答案 1 :(得分:1)
您需要将&
转换为其实体&
,或将内容包装在CDATA标记中。
如果选择实体路线,则需要将其他字符转换为实体:
> >
< <
' '
" "
答案 2 :(得分:0)
public function sanitize(string $data) {
return str_replace('&', '&', $data);
}
你是对的:这里有更多的背景 - 这个例子与'如何处理包含'&amp;'的数据有关当我们将此数据传递给SimpleXml时。当然还有其他解决方案可供使用
<![CDATA[some stuff]]>
答案 3 :(得分:0)
使用xml转义功能切换和正则表达式。
function XmlEscape(str) {
if (!str || str.constructor !== String) {
return "";
}
return str.replace(/[\"&><]/g, function (match) {
switch (match) {
case "\"":
return """;
case "&":
return "&";
case "<":
return "<";
case ">":
return ">";
}
});
};
答案 4 :(得分:0)
$string =
htmlspecialchars
($string,
ENT_XML1
);
是解决所有编码错误的最通用方法(恕我直言,更好的做法是编写自定义函数+仅解决&
是没有意义的。)
信用:以Wrikken和joshweir的评论作为答案,更加明显。