解决XML根级别上的数据无效

问题描述

如果你使用过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);
}

 

posted @ 2020-09-22 20:19  我也是个傻瓜  阅读(6362)  评论(0编辑  收藏  举报