XmlNamespaceManager是C#中处理带命名空间XML的关键工具,需注册前缀与URI配对后配合XPath使用;XDocument则通过XNamespace更简洁安全地实现。

在C#中处理带命名空间的XML时,XmlNamespaceManager 是关键工具,它让 XmlDocument 或 XPathNavigator 能正确解析和查询带前缀的命名空间节点。不注册命名空间就直接用XPath查带前缀的元素(如 //ns:Book),会查不到结果。
注册命名空间前缀与URI
必须先创建 XmlNamespaceManager,并把XML中使用的命名空间前缀(如 ns)和对应URI(如 http://example.com/book)配对注册。URI必须和XML文档中声明的一致,大小写敏感。
- 从
XmlDocument的NameTable创建管理器:new XmlNamespaceManager(doc.NameTable) - 用
AddNamespace("prefix", "namespaceUri")注册,例如:mgr.AddNamespace("bk", "http://bookstore.example"); - 如果XML默认命名空间(
xmlns="...")存在,也要注册,通常用前缀如""或"def",但XPath中不能用空前缀,建议统一用非空前缀映射
用XPath查询带命名空间的节点
注册后,在 SelectNodes() 或 SelectSingleNode() 中传入带前缀的XPath,并附上 XmlNamespaceManager 实例。
- 错误写法:
doc.SelectNodes("//Book")—— 忽略命名空间,匹配失败 - 正确写法:
doc.SelectNodes("//bk:Book", mgr),前提是mgr已注册"bk"前缀 - 查询默认命名空间下的元素:先注册如
mgr.AddNamespace("d", "http://bookstore.example"),再用//d:Book
读取节点时注意命名空间上下文
用 GetElementsByTagName() 无法按命名空间筛选;它只认本地名。真正区分命名空间要用 SelectNodes() 配合 XmlNamespaceManager。
-
doc.GetElementsByTagName("Book")会返回所有叫Book的元素,不管属于哪个命名空间 - 若需精确匹配某命名空间下的
Book,必须用XPath +XmlNamespaceManager - 读取属性时同理:用
node.Attributes["id", "http://bookstore.example"]指定完整URI,或用XPath查带命名空间的属性(如@bk:id)
使用XDocument时的替代方案
XDocument(LINQ to XML)更简洁:它用 XNamespace 对象配合运算符重载,无需 XmlNamespaceManager。
- 定义命名空间:
XNamespace bk = "http://bookstore.example"; - 查询:
doc.Descendants(bk + "Book") - 查属性:
elem.Attribute(bk + "id") - 优势:类型安全、无字符串拼接、不依赖前缀,推荐新项目优先用此方式










