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