使用XmlDocument和XPath可高效筛选XML数据,如SelectNodes("//Book")提取所有书籍节点,结合XmlNamespaceManager处理命名空间,或通过XDocument配合XPath扩展方法查询带条件的元素。

在C#中使用XPath筛选XML数据是一种高效且灵活的方法,尤其适用于需要从结构化XML文档中提取特定节点或属性的场景。通过System.Xml命名空间中的类,如XDocument、XmlDocument和XmlNode,你可以结合XPath表达式快速定位所需数据。
加载XML并使用XPath查询
要使用XPath,首先需要加载XML文档。推荐使用XmlDocument类,因为它原生支持XPath查询。
以下是一个基本示例:
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"
C#入门经典
张三
89.00
深入理解C#
李四
75.50
");
// 使用XPath选择所有Book节点
XmlNodeList books = doc.SelectNodes("//Book");
foreach (XmlNode book in books)
{
string title = book["Title"]?.InnerText;
string author = book["Author"]?.InnerText;
string price = book["Price"]?.InnerText;
Console.WriteLine($"书名:{title},作者:{author},价格:{price}");
}
}
}
常用XPath表达式语法
XPath提供强大的路径匹配能力,以下是在C#中常用的表达式:
- //Book:选择所有名为Book的节点,无论层级
- /Books/Book:选择根节点下Books中的直接子节点Book
- //Book[@id='1']:选择id属性为1的Book节点
- //Book[Price > 80]:选择价格大于80的书籍(支持简单逻辑判断)
- //Book[1]:选择第一个Book节点(索引从1开始)
- //Book/Title/text():获取所有Title元素的文本内容
通过命名空间处理带前缀的XML
如果XML包含命名空间,必须在查询时注册XmlNamespaceManager,否则XPath无法正确匹配。
示例:
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"
ASP.NET教程
");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("bk", "http://example.com/books");
XmlNode node = doc.SelectSingleNode("//bk:Title", nsmgr);
Console.WriteLine(node?.InnerText); // 输出:ASP.NET教程
使用XDocument与XPath的结合(需引用System.Xml.XPath)
XDocument更现代,但需要引入System.Xml.XPath扩展方法才能使用XPath。
确保添加引用:
using System.Xml.Linq; using System.Xml.XPath;
示例代码:
XDocument xDoc = XDocument.Parse(@"
C#高级编程
");
var query = xDoc.XPathSelectElements("//Book[@category='programming']");
foreach (var book in query)
{
Console.WriteLine(book.Element("Title")?.Value);
}
基本上就这些。掌握XPath语法和C#中的查询方式后,就能高效地从复杂XML中提取所需信息。注意路径写法、命名空间处理和数据类型转换,避免空引用异常。不复杂但容易忽略细节。










