xmldocument.load() 常见报错为 filenotfoundexception 或编码异常,需用绝对路径或 basedirectory 拼接;含 bom 或 gb2312 编码时须用 xmlreader.create() 显式指定 encoding;selectsinglenode() 支持 xpath 精确定位,getelementsbytagname() 仅按标签名批量获取;修改节点前须确认可编辑性,保存前确保目录存在且文件未被占用;超 10mb 文件应改用 xmlreader/xmlwriter 流式处理。
XmlDocument.Load() 读取 XML 文件时路径错误或编码异常
常见报错是 System.IO.FileNotFoundException 或 System.Text.Encoding.GetEncoding() 抛出异常,本质是路径没找到,或文件用了 UTF-8 with BOM / GB2312 等非默认编码但未显式指定。
- 用绝对路径或确保相对路径基于
AppDomain.CurrentDomain.BaseDirectory计算,比如:Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.xml") - 若 XML 声明含
<?xml version="1.0" encoding="GB2312"?>,直接doc.Load(path)会失败;改用XmlReader.Create()并传入对应Encoding:
var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore };
using var reader = XmlReader.Create(path, new XmlReaderSettings { Encoding = Encoding.GetEncoding("GB2312") });
var doc = new XmlDocument();
doc.Load(reader);
用 SelectSingleNode() 和 GetElementsByTagName() 区分使用场景
SelectSingleNode() 支持 XPath,适合精确定位;GetElementsByTagName() 返回所有同名节点,不支持条件过滤,性能略高但灵活性差。
- 要找
<user id="1001"></user>:用doc.SelectSingleNode("//user[@id='1001']") - 只要所有
<name></name>节点:用doc.GetElementsByTagName("name")更快,且返回XmlNodeList可直接遍历 - XPath 中注意引号嵌套:属性值含单引号时,改用双引号包裹 XPath 字符串,或用
@attr='value'配合string.Format()拼接(需防注入)
修改节点内容后调用 Save() 却没生效?
常见原因是只改了 InnerText 却忘了节点本身是只读的(比如来自 GetElementsByTagName() 的只读集合),或保存路径权限不足、文件被其他进程占用。