web-dev-qa-db-ja.com

アンパサンド(&)でのXMLエラー

MySql dbに基づいてxmlを出力するphpファイルがあります。

記号がある場所で毎回エラーが発生します。

ここにいくつかの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:no name

そして、それは記号である正確な文字を指します。

これは、$dbrow['category']が含まれているものです。例: "cars&trucks"、または "computers&telephones"。

誰が問題が何であるか知っていますか?

ところで、私はすべてのドキュメントとxml出力でエンコーディングをUTF-8に設定しています。

21
user188962

XMLの&はエンティティを開始します。エンティティ&WhateverIsAfterThatを定義していないため、エラーがスローされます。 &amp;でエスケープする必要があります。

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

XMLでアンパサンドをエスケープする方法

他の予約文字をエスケープするには:

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

&エンティティに&amp;、または [〜#〜] cdata [〜#〜] タグでコンテンツをラップします。

エンティティルートを選択した場合、エンティティに変換する必要がある追加の文字があります。

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

背景: XMLを使用するときはアンパサンドに注意してください

ウィキペディア: XML文字エンティティ参照のリスト

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

あなたは正しい:これはより多くのコンテキストです-この例は、このデータをSimpleXmlに渡すときに、「&を含むデータを処理する方法」に関連しています。もちろん<![CDATA[some stuff]]>を使用する他の解決策もあります

0
Denise Ignatova

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