xmldocument适用于小配置或简单xml,加载需用try/catch捕获xmlexception等异常,路径存在性、编码(如utf-8)、命名空间、bom头等易致静默失败。

XmlDocument 不适合大文件,小配置或简单数据结构用它没问题;真要处理几百MB的XML,换 XmlReader 或 XDocument 流式解析。
怎么加载XML文件到 XmlDocument
别直接 new XmlDocument() 后再 Load,容易漏异常处理。文件路径错、编码不对、格式非法都会抛 XmlException 或 IOException。
- 用
try/catch包住doc.Load(filePath),尤其注意中文路径要用 UTF-8 编码保存的 XML,否则可能报“无法解析名称” - 如果 XML 来自字符串(比如 API 返回),用
doc.LoadXml(xmlString),不是Load - 加载前可先检查文件是否存在:
File.Exists(filePath),避免空指针式崩溃
怎么安全地读取节点和属性
别信 doc.DocumentElement["attrName"] 一定不为 null——属性不存在时返回 null,直接 .Value 会崩。同理,SelectSingleNode("path") 找不到就返回 null,不是抛异常。
- 读属性前判空:
var attr = node.Attributes["id"]; if (attr != null) id = attr.Value; - 查节点推荐用 XPath,但注意
xmlns:没声明命名空间就用"//book/title";有默认命名空间就得先XmlNamespaceManager注册前缀 - 取文本内容优先用
node.InnerText,不是InnerXml——后者会把子标签当字符串返回,容易误解析
怎么写入并保存XML文件
XmlDocument 修改的是内存树,Save() 才落地。但默认保存不带缩进,且会把原本的注释、空白全丢掉——这不是 bug,是设计如此。
- 保存前调用
doc.PreserveWhitespace = false(默认就是 false),想保留原始格式?基本做不到,得自己拼字符串或换XDocument.ToString(SaveOptions.Indented) - 写新节点别忘了
AppendChild()或InsertBefore(),光CreateElement()不等于加进树里 - 保存路径要确保目录存在,
Directory.CreateDirectory(Path.GetDirectoryName(savePath))最好前置执行
真正麻烦的从来不是语法,而是命名空间、编码混用、特殊字符(& )没转义、还有那种手写 XML 里多了一个不可见的 BOM 头——这些不会报编译错,但 Load 时静默失败或解析错位。











