it-swarm.com.de

XML-Fehler bei kaufmännischem Und (&)

Ich habe eine PHP-Datei, die ein XML-Dokument auf Basis einer MySql-Datenbank druckt.

Ich bekomme jedes Mal genau an der Stelle einen Fehler, an dem es ein & Zeichen gibt.

Hier ist ein 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>
}

Die Ausgabe ist das, was ich möchte, d. H. Die Datei gibt die richtige Kategorie aus, gibt aber trotzdem einen Fehler aus.

Der Fehler sagt: xmlParseEntityRef: Kein Name

Und dann zeigt es auf das genaue Zeichen, das ein & Zeichen ist.

Dies beschwert sich nur, wenn der $dbrow['category'] etwas mit einem & - Zeichen enthält, zum Beispiel: " cars & trucks " oder " Computer & Telefone ".

Weiß jemand, was das Problem ist?

Übrigens: Ich habe die Kodierung in allen Dokumenten auf UTF-8 gesetzt, ebenso wie die XML-Ausgabe.

20
user188962

& in XML startet eine Entität. Da Sie keine Entität &WhateverIsAfterThat definiert haben, wird ein Fehler ausgegeben. Sie sollten es mit &amp; entziehen.

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

Wie entkomme ich Et-Zeichen in XML

So entgehen Sie den anderen reservierten Zeichen:

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

Sie müssen entweder & in seine Entität &amp; umwandeln oder den Inhalt in CDATA tags einschließen.

Wenn Sie die Entitätsroute wählen, müssen Sie zusätzliche Zeichen in Entitäten umwandeln:

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

Hintergrund: Vorsicht bei der Verwendung von XML vor dem Et-Zeichen

Wikipedia: Liste der Verweise auf XML-Zeichenentitäten

1
Pekka 웃
public function sanitize(string $data) {
    return str_replace('&', '&amp;', $data);
}

Sie haben recht: Hier ist mehr Kontext - das Beispiel bezieht sich auf das 'Wie' mit Daten umgehen, die '&' enthalten, wenn wir diese Daten an SimpleXml übergeben. Natürlich gibt es auch eine andere Lösung zur Verwendung von <![CDATA[some stuff]]>

0
Denise Ignatova

Wechseln und regulieren Sie den Ausdruck mit der XML-Escape-Funktion.

 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