在C#开发过程中,XML作为一种轻量级的数据交换格式,常被用于存储配置信息、传输业务数据。获取XML节点特定属性的值是处理XML数据时高频出现的操作需求,不同的XML处理方案对应不同的实现逻辑,开发者可以根据实际场景选择最合适的方案。

方法一:使用XmlDocument结合XPath查询
XmlDocument是.NET框架中传统的XML文档处理类,支持通过XPath语法快速定位节点和属性,适合熟悉XPath语法的开发者使用。首先需要加载XML文档,再通过XPath表达式定位目标节点,最后获取对应属性的值。
假设我们有如下结构的XML文件,需要获取id为2的student节点的name属性值:
<students> <student id="1" name="张三" age="18" /> <student id="2" name="李四" age="19" /> <student id="3" name="王五" age="20" /> </students>
对应的C#实现代码如下:
using System;
using System.Xml;
class Program
{
static void Main()
{
// 创建XmlDocument实例并加载XML内容
XmlDocument xmlDoc = new XmlDocument();
// 这里可以替换为Load方法加载本地XML文件,比如xmlDoc.Load("students.xml");
string xmlContent = @"<students>
<student id=""1"" name=""张三"" age=""18"" />
<student id=""2"" name=""李四"" age=""19"" />
<student id=""3"" name=""王五"" age=""20"" />
</students>";
xmlDoc.LoadXml(xmlContent);
// 使用XPath定位id为2的student节点
XmlNode targetNode = xmlDoc.SelectSingleNode("/students/student[@id='2']");
if (targetNode != null)
{
// 获取name属性的值
XmlAttribute nameAttr = targetNode.Attributes["name"];
if (nameAttr != null)
{
Console.WriteLine("目标学生姓名:" + nameAttr.Value);
}
}
}
}
注意事项
- XPath表达式中的属性判断需要放在方括号内,@符号用于标识属性
- 获取属性前需要判断节点和属性是否存在,避免出现空引用异常
- 如果XML有命名空间,需要额外配置XmlNamespaceManager才能正确查询
方法二:使用LINQ to XML查询
LINQ to XML是.NET 3.5之后推出的更现代化的XML处理方案,语法更简洁,和LINQ查询结合更紧密,代码可读性更高,也是目前推荐的主流使用方式。
同样处理上面的XML结构,使用LINQ to XML获取id为2的student节点的name属性值的代码如下:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 加载XML内容,也可以替换为XDocument.Load加载本地文件
string xmlContent = @"<students>
<student id=""1"" name=""张三"" age=""18"" />
<student id=""2"" name=""李四"" age=""19"" />
<student id=""3"" name=""王五"" age=""20"" />
</students>";
XDocument xDoc = XDocument.Parse(xmlContent);
// 使用LINQ查询定位目标节点
XElement targetElement = xDoc.Descendants("student")
.FirstOrDefault(e => (string)e.Attribute("id") == "2");
if (targetElement != null)
{
// 获取name属性的值
XAttribute nameAttr = targetElement.Attribute("name");
if (nameAttr != null)
{
Console.WriteLine("目标学生姓名:" + nameAttr.Value);
}
}
}
}
方案优势
- 无需记忆复杂的XPath语法,使用熟悉的LINQ查询逻辑即可完成节点筛选
- 属性获取方式更直观,Attribute方法直接返回对应的XAttribute对象
- 支持链式调用,复杂查询场景下的代码更简洁
方法三:使用XmlReader流式读取
如果需要处理非常大的XML文件,一次性加载整个文档会占用过多内存,此时可以使用XmlReader进行流式读取,边读边提取需要的属性值,内存占用更低。
对应的实现代码如下:
using System;
using System.Xml;
class Program
{
static void Main()
{
string xmlContent = @"<students>
<student id=""1"" name=""张三"" age=""18"" />
<student id=""2"" name=""李四"" age=""19"" />
<student id=""3"" name=""王五"" age=""20"" />
</students>";
// 创建XmlReader实例
using (XmlReader reader = XmlReader.Create(new System.IO.StringReader(xmlContent)))
{
while (reader.Read())
{
// 判断当前节点是否为student元素开始标签
if (reader.NodeType == XmlNodeType.Element && reader.Name == "student")
{
// 获取id属性的值
string id = reader.GetAttribute("id");
if (id == "2")
{
// 获取name属性的值
string name = reader.GetAttribute("name");
Console.WriteLine("目标学生姓名:" + name);
break;
}
}
}
}
}
}
不同方案的选择建议
| 方案 | 适用场景 | 优势 |
|---|---|---|
| XmlDocument+XPath | 熟悉XPath语法、需要兼容旧项目 | 查询语法灵活,旧项目兼容性好 |
| LINQ to XML | 新项目开发、需要简洁代码逻辑 | 语法直观,和LINQ结合紧密,可读性强 |
| XmlReader流式读取 | 超大XML文件处理、内存资源有限场景 | 内存占用低,适合大文件处理 |
C#XMLXmlDocumentLINQ_to_XMLXPath修改时间:2026-06-11 16:48:29