




XmlNamespaceManager是C#中处理带命名空间XML的关键工具,需注册前缀与URI配对后配合XPath使用;XDocument则通过XNamespace更简洁安全地实现。
在C#中处理带命名空间的XML时, XmlNamespaceManager 是关键工具,它让 XmlDocument 或 XPath 能正确解析和查询带前缀的命名空间节点。不注册命名空间就直接用XPath查带前缀的元素(如 
//ns:Book),会查不到结果。
必须先创建 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");
xmlns="...")存在,也要注册,通常用前缀如 "" 或 "def",但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(LINQ to XML)更简洁:它用 XNamespace 对象配合运算符重载,无需 XmlNamespaceManager。
XNamespace bk = "http://bookstore.example";
doc.Descendants(bk + "Book")
elem.Attribute(bk + "id")