1.內(nèi)容中含有xml預(yù)定好的實(shí)體,如“<”和“&”,對(duì)xml來(lái)說(shuō)是禁止使用的,針對(duì)這種字符,解決方式是使用CDATA部件以"<![CDATA[" 標(biāo)記開始,以"]]>"標(biāo)記結(jié)束,是CDATA內(nèi)部?jī)?nèi)容被解析器忽略。具體說(shuō)明參考《XML CDATA是什么?》。
2.內(nèi)容中含有低位非打印字符,解析時(shí)會(huì)報(bào)錯(cuò):""(十六進(jìn)制值 0x1D)是無(wú)效的字符.加載或保存XML時(shí)引發(fā)的異常.System.ArgumentException: “”(十六進(jìn)制值 0x1D)是無(wú)效的字符。
出錯(cuò)的原因是內(nèi)容中含有低位非打印字符,處理方法是對(duì)其進(jìn)行過(guò)濾,過(guò)濾方法為:
return System.Text.RegularExpressions.Regex.Replace(str,@"[/x00-/x08]|[/x0B-/x0C]|[/x0E-/x1F]";
以上兩種情況,第一種較為普遍,第二種遇到情況比較少,在面對(duì)一些用戶輸入數(shù)據(jù)時(shí)生成xml,可以對(duì)xml結(jié)點(diǎn)內(nèi)容執(zhí)行上述過(guò)濾,以保證xml文件使用者可以正確解析xml文檔。
以下是詳細(xì)解釋:
“”(十六進(jìn)制值 0x1D)是無(wú)效的字符
加載或保存XML時(shí)引發(fā)的異常.System.ArgumentException: “”(十六進(jìn)制值 0x1D)是無(wú)效的字符。
產(chǎn)生原因是xml文件中包含低位非打印字符造成的
處理方法:在產(chǎn)生xml文件的時(shí)候,過(guò)濾低位非打印字符
把一個(gè)字符串中的 低序位 ASCII 字符 替換成 字符
轉(zhuǎn)換 ASCII 0 - 8 -> -
轉(zhuǎn)換 ASCII 11 - 12 -> -
轉(zhuǎn)換 ASCII 14 - 31 -> -
簡(jiǎn)單的處理方法
return System.Text.RegularExpressions.Regex.Replace(HttpUtility.HtmlEncode(str),@"[/x00-/x08]|[/x0B-/x0C]|[/x0E-/x1F]", "");
======================================================================================================================================================
復(fù)雜處理
獲取xml時(shí),出現(xiàn)“(十六進(jìn)制值 0x1F)是無(wú)效的字符之類Xml異常的解決辦法2008-12-19 10:44最近做新聞采集器,需要獲取很多站點(diǎn)的xml,加載個(gè)別站點(diǎn)經(jīng)常出現(xiàn)“(十六進(jìn)制值 0x1F)是無(wú)效的字符”問(wèn)題,百思不的其解。對(duì)于問(wèn)題站點(diǎn)xml的處理,開始的思路是既然直接用 XmlDocument對(duì)象的Load()方法不行,就用LoadXML() ,用HttpWebRequest 獲取url讀到流里再轉(zhuǎn)為xml,中間可以加一些非有效字符的過(guò)濾處理,但仍然無(wú)效,僅僅解決了請(qǐng)求超時(shí)的問(wèn)題...
問(wèn)題擱置了1周后,終于在今天解決了。
其實(shí)很簡(jiǎn)單,只加一條語(yǔ)句就搞定了
XmlDocument doc = new XmlDocument();
doc.Normalize();
// 摘要:
// 將此 XmlNode 下子樹完全深度中的所有 XmlText 節(jié)點(diǎn)都轉(zhuǎn)換成“正常”形式,在這種形式中只有標(biāo)記(即標(biāo)記、注釋、處理指令、CDATA
// 節(jié)和實(shí)體引用)分隔 XmlText 節(jié)點(diǎn),也就是說(shuō),沒(méi)有相鄰的 XmlText 節(jié)點(diǎn)。
以下是轉(zhuǎn)一位仁兄的貼:
最近碰到一個(gè)問(wèn)題,我的一個(gè)把數(shù)據(jù)庫(kù)中記錄的信息暴露出來(lái)的Web Service調(diào)用時(shí)候出問(wèn)題了。報(bào)下面的錯(cuò)誤信息:
System.InvalidOperationException was unhandledMessage="XML 文檔(1, 823)中有錯(cuò)誤。"Source="System.Xml" Message="“”(十六進(jìn)制值 0x0E)是無(wú)效的字符。 行 1,位置 823。" Source="System.Xml"
當(dāng)這個(gè)錯(cuò)誤發(fā)生時(shí),Web Service 服務(wù)器端不會(huì)有任何錯(cuò)誤,而調(diào)用這個(gè) Web Service 的客戶端則會(huì)報(bào)上述錯(cuò)誤。
是何原因?qū)е碌倪@個(gè)問(wèn)題呢?
答案很簡(jiǎn)單,是WEB Service 暴露的XML文檔中存在低序位非打印 ASCII 字符所致。
我們查看 Web Service 返回的XML 文檔文檔中,會(huì)有下面的XML文檔節(jié):其中的 就是低序位 ASCII 字符。 對(duì)應(yīng)的字符如后:
<Value> 在神奇天地 主站蜘蛛池模板: 靖宇县| 赤壁市| 固阳县| 宜良县| 许昌市| 斗六市| 云南省| 仙游县| 城固县| 通榆县| 区。| 平邑县| 满城县| 视频| 安图县| 军事| 新竹县| 东城区| 城固县| 东辽县| 金山区| 五原县| 广汉市| 通榆县| 罗定市| 襄汾县| 秭归县| 阜康市| 乐昌市| 华坪县| 淳化县| 阿克| 长乐市| 元氏县| 波密县| 常德市| 子洲县| 静海县| 靖宇县| 凤山县| 汤阴县|