&符号中的XML错误(&)

21 html php xml mysql database

我有一个php文件,它打印一个基于MySql数据库的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>
}
Run Code Online (Sandbox Code Playgroud)

输出是我想要的,即文件输出正确的类别,但仍然给出错误.

错误说:xmlParseEntityRef:没有名字

然后它指向一个&符号的确切字符.

只有在$dbrow['category']带有&符号的东西时才会抱怨,例如:" 汽车和卡车 ",或" 电脑和电话 ".

有谁知道问题是什么?

顺便说一句:我在所有文档中都将编码设置为UTF-8,以及xml输出.

Nik*_*kiC 45

&在XML中启动一个实体.由于您尚未定义实体&WhateverIsAfterThat,因此会引发错误.你应该逃避它&amp;.

$string = str_replace('&', '&amp;', $string);
Run Code Online (Sandbox Code Playgroud)

如何在XML中转义&符号

要转义其他保留字符:

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

  • 或者,更紧凑,`htmlspecialchars($ string,ENT_QUOTES);` (13认同)
  • 为了确保字符串实际上是安全的,我认为它应该分两个阶段完成.例如:$ string ='Foo&amp; 酒吧'; $ string = str_replace('&amp;','&',$ string); // Foo&Bar $ string = str_replace('&','&amp;',$ string); // Foo&amp; Bar如果只有一个阶段,结果可以是'Foo&amp; amp; 酒吧' (3认同)
  • 我建议您使用 `ENT_XML1` 选项:`htmlspecialchars($string, ENT_XML1);` 以确保字符串被适当地转义为 XML。 (3认同)
  • 包裹在 &lt;![CDATA 标签中是更合乎逻辑的解决方案 (2认同)

pev*_*vik 6

$string =htmlspecialchars($string,ENT_XML1);

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

图片来源:将 Wrikken 和 joshweir 的评论作为答案,以便更加明显。