使用xmlDocument或XDocument可获取XML属性值:先加载XML,再通过XPath或linq定位节点,最后读取Attribute.Value;含命名空间时需声明XNamespace。

在c#中获取XML特定属性的值,可以通过多种方式实现,常用的方法包括使用 XmlDocument、XDocument(LINQ to XML)以及 XmlnodeReader。下面介绍几种实用且清晰的查询方法。
使用 XmlDocument 查询属性值
XmlDocument 适合处理结构较复杂的XML文件,通过XPath定位节点并读取属性。
示例XML:
<Books> <Book id="1" title="C#入门" author="张三" /> <Book id="2" title="XML编程" author="李四" /> </Books>
获取第一个 Book 节点的 title 属性值:
XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); // 或 LoadXml("字符串") XmlNode node = doc.SelectSingleNode("/Books/Book"); if (node != NULL && node.Attributes["title"] != null) { string title = node.Attributes["title"].Value; Console.WriteLine(title); // 输出:C#入门 }
查找 id=”2″ 的 Book 的 author 属性:
XmlNode node = doc.SelectSingleNode("/Books/Book[@id='2']"); if (node != null) { string author = node.Attributes["author"].Value; Console.WriteLine(author); // 输出:李四 }
使用 LINQ to XML(XDocument)
XDocument 更现代,语法更简洁,推荐用于新项目。
XDocument xDoc = XDocument.Load("books.xml"); var book = xDoc.Descendants("Book") .FirstOrDefault(b => b.Attribute("id")?.Value == "2"); if (book != null) { string title = book.Attribute("title")?.Value; Console.WriteLine(title); // 输出:XML编程 }
也可以直接遍历所有 Book 节点并提取属性:
var books = xDoc.Descendants("Book"); foreach (var b in books) { string id = b.Attribute("id")?.Value; string title = b.Attribute("title")?.Value; Console.WriteLine($"ID: {id}, Title: {title}"); }
处理命名空间的XML
如果XML包含命名空间,必须在查询时指定。
示例带命名空间的XML:
<?xml version="1.0" encoding="utf-8"?> <Books xmlns="http://example.com/ns"> <Book id="1" title="Web开发" /> </Books>
正确读取方式:
XNamespace ns = "http://example.com/ns"; XDocument xDoc = XDocument.Load("books.xml"); var book = xDoc.Descendants(ns + "Book").FirstOrDefault(); if (book != null) { string title = book.Attribute("title")?.Value; Console.WriteLine(title); // 输出:Web开发 }
小结与建议
选择哪种方式取决于你的场景:
- 若项目较老或需兼容性,使用 XmlDocument
- 若追求简洁和可读性,优先用 XDocument + LINQ
- 注意处理属性可能为 null 的情况,使用 ?. 操作符避免异常
- 带命名空间的XML务必声明并使用 XNamespace
基本上就这些,掌握 SelectSingleNode 和 Descendants 配合属性查询,就能应对大多数需求。


