0

私の RESTful WCF サービスは、クライアントからの XML 要求本文を受け入れます。ほとんどのクライアントは PHP アプリケーションです。

PHP アプリケーションは、要素タグ内に配置された htmlentities() を使用してリクエストをエンコードします。たとえば、新しいユーザー アカウントを追加するリクエストは次のようになります。

$body = "<user>
    <userName>" . htmlentities( $userName ) . "</userName>
</user>"

システムは正常に動作し、今日までエラーはありませんでした。

ログを調べたところ、このリクエストが失敗したことがわかりました。

<user>
    <userName>&egrave;eesu</userName>
</user>

ただし、次の例外があります。

InvalidOperationException: "XML ドキュメントにエラーがあります (4、12)。" XmlException: 「文字参照が無効です。4 行目、12 番目の位置。」

(ここで、4 行目の 12 番目の位置は、<userName>要素の InnerText (つまり、 string ) を参照します&egrave;eesu;)。

&egrave;&amp;は有効な HTML エンティティですが、XML は文字参照 ( 、&lt;など)の最小セットのみを定義し、 XML は他のすべての文字が代わりにドキュメント エンコーディング表現にあることを想定しているため、 などを拒否することを理解しています&egrave;

誰かがこれが事実であることを確認できますか? もしそうなら、HTMLエンティティではなくXML固有のエンティティのみをエンコードするようにPHPを取得するにはどうすればよいですか?

4

2 に答える 2

2

XML には 5 つのエンティティしかありません。HTML エンティティへの解析は、エンティティ自体にエンコードされていない & を作成するため、特定の文字で中断します。

エンティティをエスケープするには、htmlentities() の代わりにこの関数を使用します。

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

Tomas Jancik の anwser から同様の質問への借用: Generating XML document in PHP (escape characters)

于 2012-06-26T23:55:17.340 に答える
-1

代わりに使用htmlspecialchars( $userName, ENT_XML1 )します。これは、不必要にエンコードすることなく、最小限の文字のみをエンティティに変換します。

@Jordan の str_replace 関数は同じことを行いますが、htmlspecialchars はネイティブ関数であるため、ベンチマークすると遅くなります。

于 2012-08-25T13:12:14.357 に答える