&符号中的XML错误(&)

时间:2010-10-26 17:59:58

标签: php mysql html xml database

我有一个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输出。

5 个答案:

答案 0 :(得分:42)

XML中的

&启动实体。由于您尚未定义实体&WhateverIsAfterThat,因此会引发错误。你应该用&amp;转义它。

$string = str_replace('&', '&amp;', $string);

How do I escape ampersands in XML

要转义其他保留字符:

function xmlEscape($string) {
    return str_replace(array('&', '<', '>', '\'', '"'), array('&amp;', '&lt;', '&gt;', '&apos;', '&quot;'), $string);
}

答案 1 :(得分:1)

您需要将&转换为其实体&amp;,或将内容包装在CDATA标记中。

如果选择实体路线,则需要将其他字符转换为实体:

>  &gt;
<  &lt;
'  &apos;
"  &quot;

背景:Beware of the ampersand when using XML

维基百科:List of XML character entity references

答案 2 :(得分:0)

public function sanitize(string $data) {
    return str_replace('&', '&amp;', $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 "&quot;";
        case "&":
            return "&amp;";
        case "<":
            return "&lt;";
        case ">":
            return "&gt;";
        }
    });
};

答案 4 :(得分:0)

$string = htmlspecialchars ($string, ENT_XML1 );

是解决所有编码错误的最通用方法(恕我直言,更好的做法是编写自定义函数+仅解决&是没有意义的。)

信用:以Wrikken和joshweir的评论作为答案,更加明显。