問題描述
如果你使用過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); }