J'ai un fichier php qui imprime un fichier XML basé sur une base de données MySql.
Je reçois une erreur à chaque fois exactement au point où il y a un signe & .
Voici quelques 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>
}
La sortie correspond à ce que je veux, c’est-à-dire que le fichier affiche la catégorie correcte, mais donne toujours une erreur.
L'erreur dit: xmlParseEntityRef: no name
Et puis il pointe vers le caractère exact qui est un signe & .
Cela ne se plaint que si le $dbrow['category']
est quelque chose comportant un signe & , par exemple: " cars & trucks ", ou " ordinateurs & téléphones ".
Quelqu'un sait quel est le problème?
BTW: Le codage est défini sur UTF-8 dans tous les documents, ainsi que sur la sortie XML.
&
en XML démarre une entité. Comme vous n'avez pas défini d'entité &WhateverIsAfterThat
, une erreur est générée. Vous devriez y échapper avec &
.
$string = str_replace('&', '&', $string);
Comment échapper aux esperluettes en XML
Pour échapper aux autres personnages réservés:
function xmlEscape($string) {
return str_replace(array('&', '<', '>', '\'', '"'), array('&', '<', '>', ''', '"'), $string);
}
Vous devez soit transformer &
en son entité &
, soit envelopper le contenu dans CDATA tags.
Si vous choisissez l'itinéraire d'entité, vous devez transformer d'autres entités en entités:
> >
< <
' '
" "
Contexte: Faites attention à la perluète lors de l'utilisation de XML
public function sanitize(string $data) {
return str_replace('&', '&', $data);
}
Vous avez raison: voici plus de contexte - l'exemple concerne le 'comment traiter les données contenant' & 'lorsque nous transmettons ces données à SimpleXml. Bien sûr, il existe aussi une autre solution à utiliser <![CDATA[some stuff]]>
Commutez et regex en utilisant la fonction d'échappement 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 ">";
}
});
};