web-dev-qa-db-fra.com

Erreur XML à l'esperluette (&)

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.

20
user188962

& 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 &amp;.

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

Comment échapper aux esperluettes en XML

Pour échapper aux autres personnages réservés:

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

Vous devez soit transformer & en son entité &amp;, 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:

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

Contexte: Faites attention à la perluète lors de l'utilisation de XML

Wikipedia: Liste des références d'entités de caractères XML

1
Pekka 웃
public function sanitize(string $data) {
    return str_replace('&', '&amp;', $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]]>

0
Denise Ignatova

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 "&quot;";
        case "&":
            return "&amp;";
        case "<":
            return "&lt;";
        case ">":
            return "&gt;";
        }
    });
};
0
Huseyin Durmus