2012-06-26 26 views
0

我的RESTful WCF服務接受來自客戶端的XML請求體,大多數客戶端是PHP應用程序。WCF/PHP - XML解析器無法處理HTML實體?

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(即,字符串&egrave;eesu;)。

&egrave;是一個有效的HTML實體,但我明白,XML只定義一組最小字符引用的( &amp;&lt;等),以及XML希望所有其他字符,在他們的文檔編碼表示代替,因此會拒絕像&egrave;事情。

有人可以確認是這種情況嗎?如果是這樣,我怎麼能讓PHP只編碼XML特定的實體而不是HTML實體?

回答

-1

我用htmlspecialchars($userName, ENT_XML1)代替,只轉換最小字符到實體,而不必對其進行編碼。

@ Jordan的str_replace函數執行相同的操作,但是當您對它進行基準測試時,速度較慢,因爲htmlspecialchars是本機函數。

+0

ENT_XML1不是一個有效的常量 – Michelangelo

+1

@Michelangelo是的它是:http://php.net/manual/en/function.htmlspecialchars.php「ENT_XML1 - 處理代碼爲XML 1」。 – Dai

+0

這個選項僅適用於特定版本的php – Michelangelo

2

XML只有5 entities。解析爲html實體會破壞某些字符,因爲它會在實體本身中創建未編碼的&。

使用此功能,而不是ヶ輛()逃離實體:

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

從托馬斯Jancik的anwser借了一個類似的問題: Generating XML document in PHP (escape characters)