问题描述
如果你使用过C#操作XML,应该都遇到过本文所描述的问题,那就是使用XmlDocument的LoadXml方法读取XML文件报错"XML根级别上的数据无效",代码很简单,如下:
XmlDocument doc = new XmlDocument(); doc.LoadXml(filePath);
直接报错如下,难道是微软未修复的bug?
问题分析
为了搞清楚问题,我们先来看看源码:
Load进行了多次重载,支持直接加载文件路径、文件流、读取器。
而LoadXml没有重载,只能输入支持StringReader,即根本没有读取路径文件中的文件内容,而是直接把路径当作XML处理。
我们把SetupReader中的参数分步解析后,发现当输入一个文件路径,并不能解析为XML文本,因为并没有<>,而是返回了None
所以,报错也很自然了,原来是我们混淆了两者的使用方法。
解决方案
Load:支持xml路径、文件流、不支持XML文本;
LoadXml:支持XML文本,不支持xml路径。
private void ReadXmlByPath(string filePath) { XmlDocument doc = new XmlDocument(); //正确 doc.Load(filePath); //错误:System.Xml.XmlException:“根级别上的数据无效。 第 1 行,位置 1。” //doc.LoadXml(filePath); } private void ReadXmlByString(string strXml) { XmlDocument doc = new XmlDocument(); //错误:System.ArgumentException:“路径中具有非法字符。” //doc.Load(strXml); //正确 doc.LoadXml(strXml); }