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に設定しています。
XMLの&
はエンティティを開始します。エンティティ&WhateverIsAfterThat
を定義していないため、エラーがスローされます。 &
でエスケープする必要があります。
$string = str_replace('&', '&', $string);
他の予約文字をエスケープするには:
function xmlEscape($string) {
return str_replace(array('&', '<', '>', '\'', '"'), array('&', '<', '>', ''', '"'), $string);
}
&
エンティティに&
、または [〜#〜] cdata [〜#〜] タグでコンテンツをラップします。
エンティティルートを選択した場合、エンティティに変換する必要がある追加の文字があります。
> >
< <
' '
" "
背景: XMLを使用するときはアンパサンドに注意してください
ウィキペディア: XML文字エンティティ参照のリスト
public function sanitize(string $data) {
return str_replace('&', '&', $data);
}
あなたは正しい:これはより多くのコンテキストです-この例は、このデータをSimpleXmlに渡すときに、「&を含むデータを処理する方法」に関連しています。もちろん<![CDATA[some stuff]]>
を使用する他の解決策もあります
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 ">";
}
});
};