C#如何使用XPath从XML中筛选数据_C#使用XPath筛选XML数据教程

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

在C#中使用XPath筛选XML数据是一种高效且灵活的方法,尤其适用于需要从结构化XML文档中提取特定节点或属性的场景。通过System.Xml命名空间中的类,如XDocumentXmlDocumentXmlNode,你可以结合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中提取所需信息。注意路径写法、命名空间处理和数据类型转换,避免空引用异常。不复杂但容易忽略细节。