XmlDocument加載xml文檔,能夠用Load加載實體文件,也能夠用LoadXml加載字符串,可是使用的時候有個小坑須要注意。先來看如下幾行代碼:c#
var xml = new XmlDocument(); xml.Load("test.xml"); // <--- 方法1 xml.LoadXml(File.ReadAllText("test.xml", Encoding.UTF8)); // <--- 方法2 xml.LoadXml(Encoding.UTF8.GetString(File.ReadAllBytes("test.xml"))); // <--- 方法3
運行一下,會發現方法1和2沒什麼區別,但方法3會報錯:ide
System.Xml.XmlException: 根級別上的數據無效。 第 1 行,位置 1。
緣由出在UTF8的BOM上,Windows系統下,UTF8文件保存會在頭部保存3個字節,EF BB BF,若是按文本方式處理文件(File.ReadAllText),獲得的字符串是不會包含這3個不可見字符的,但若是用二進制方式處理文件再轉字符串(File.ReadAllBytes再GetString),獲得的字符串就有問題了,致使XmlDocument認爲XML格式不合法。
spa
對本地文件來講,通常不太可能用到方法3,可是若是是從遠程接收文件,就會遇到與方法3相似的狀況了,此時須要識別一下,若是有BOM,要去除掉再轉化字符串。xml