在C#的开发场景中,XML文档常被用来存储配置信息、传输结构化数据,解析XML文档是开发者需要掌握的基础技能。XmlDocument是.NET Framework提供的用于处理XML文档的核心类,基于DOM(文档对象模型)实现,能够将整个XML文档加载到内存中,方便开发者通过节点操作的方式读取和修改XML内容。
XmlDocument基础使用步骤
使用XmlDocument解析XML文档的核心流程分为三步:加载XML内容、获取目标节点、读取节点信息。下面先介绍XML文档的加载方式。
1. 加载XML文档
XmlDocument支持从文件路径、字符串、流三种方式加载XML内容,常用的是从文件路径加载和从字符串加载。
using System.Xml;
class Program
{
static void Main()
{
// 创建XmlDocument实例
XmlDocument xmlDoc = new XmlDocument();
// 方式1:从本地文件路径加载XML
xmlDoc.Load("test.xml");
// 方式2:从XML字符串加载
string xmlStr = "<?xml version="1.0" encoding="utf-8"?><root><user id="1">张三</user></root>";
xmlDoc.LoadXml(xmlStr);
}
}
2. 获取XML节点
加载XML后,可以通过SelectSingleNode获取单个节点,通过SelectNodes获取多个匹配的节点,这两个方法支持XPath语法查询节点。
using System.Xml;
class Program
{
static void Main()
{
XmlDocument xmlDoc = new XmlDocument();
string xmlStr = "<?xml version="1.0" encoding="utf-8"?>" +
"<root>" +
"<user id="1">张三</user>" +
"<user id="2">李四</user>" +
"</root>";
xmlDoc.LoadXml(xmlStr);
// 获取根节点
XmlNode rootNode = xmlDoc.SelectSingleNode("root");
// 获取所有user节点
XmlNodeList userNodes = xmlDoc.SelectNodes("root/user");
// 获取id为1的user节点
XmlNode targetUser = xmlDoc.SelectSingleNode("root/user[@id='1']");
}
}
3. 读取节点内容和属性
获取节点后,可以通过InnerText属性获取节点的文本内容,通过Attributes集合获取节点的属性值。
using System.Xml;
class Program
{
static void Main()
{
XmlDocument xmlDoc = new XmlDocument();
string xmlStr = "<?xml version="1.0" encoding="utf-8"?>" +
"<root>" +
"<user id="1">张三</user>" +
"</root>";
xmlDoc.LoadXml(xmlStr);
XmlNode userNode = xmlDoc.SelectSingleNode("root/user");
// 读取节点文本内容
string userName = userNode.InnerText;
// 读取节点id属性
string userId = userNode.Attributes["id"].Value;
}
}
常见操作示例
遍历所有子节点
当需要读取XML中同层级的多个节点时,可以遍历XmlNodeList集合获取每个节点的信息。
using System.Xml;
class Program
{
static void Main()
{
XmlDocument xmlDoc = new XmlDocument();
string xmlStr = "<?xml version="1.0" encoding="utf-8"?>" +
"<root>" +
"<user id="1">张三</user>" +
"<user id="2">李四</user>" +
"<user id="3">王五</user>" +
"</root>";
xmlDoc.LoadXml(xmlStr);
XmlNodeList userNodes = xmlDoc.SelectNodes("root/user");
foreach (XmlNode node in userNodes)
{
string id = node.Attributes["id"].Value;
string name = node.InnerText;
// 输出每个用户的id和名称
}
}
}
修改XML节点内容
XmlDocument也支持修改XML节点的内容和属性,修改完成后可以通过Save方法将修改后的内容保存到文件或流中。
using System.Xml;
class Program
{
static void Main()
{
XmlDocument xmlDoc = new XmlDocument();
string xmlStr = "<?xml version="1.0" encoding="utf-8"?>" +
"<root>" +
"<user id="1">张三</user>" +
"</root>";
xmlDoc.LoadXml(xmlStr);
XmlNode userNode = xmlDoc.SelectSingleNode("root/user");
// 修改节点文本内容
userNode.InnerText = "张三_new";
// 修改节点属性
userNode.Attributes["id"].Value = "100";
// 保存到本地文件
xmlDoc.Save("new_test.xml");
}
}
注意事项
- 加载XML时如果XML格式不正确,会抛出异常,建议加载时使用try-catch块捕获异常。
- 使用XPath查询节点时,如果路径不存在,
SelectSingleNode会返回null,直接操作返回值会出现空引用异常,需要先做非空判断。 - XmlDocument会将整个XML文档加载到内存中,如果XML文档体积过大,可能会导致内存占用过高,此时可以考虑使用XmlReader流式解析。
C#XmlDocumentXML解析XML文档修改时间:2026-06-26 22:54:39