XmlDocument 与 XPathNavigator 通过 CreateNavigator() 方法配合使用,前者提供 DOM 内存模型,后者提供游标式可读写访问;支持高效 XPath 查询、精细导航、命名空间处理及直接编辑文档节点。

XmlDocument 和 XPathNavigator 可以配合使用,核心是用 XmlDocument.CreateNavigator() 获取一个可读写的 XPathNavigator 实例,从而在已加载的 XML 文档上执行高效、灵活的 XPath 查询和节点操作。
从 XmlDocument 创建 XPathNavigator
XmlDocument 是基于 DOM 的内存文档模型,而 XPathNavigator 提供了游标式(cursor-based)的只读或可写访问方式。二者结合的关键入口是 CreateNavigator() 方法:
- 调用
doc.CreateNavigator()返回一个默认定位在文档根节点的 XPathNavigator - 该导航器与原始 XmlDocument 共享底层数据,修改 navigator(如启用编辑)会影响原文档
- 若只需查询,推荐用只读模式(默认);若需增删改节点,需确保 navigator 支持编辑(XmlDocument 创建的 navigator 默认支持)
用 XPathNavigator 查询 XmlDocument 中的数据
相比 XmlDocument.SelectNodes/SelectSingleNode,XPathNavigator 提供更细粒度控制,比如逐个移动、定位上下文、处理命名空间:
- 用
navigator.Select("//book/title")返回 XPathNodeIterator,可遍历匹配节点 - 用
navigator.MoveToRoot()、navigator.MoveToFirstChild()等方法手动导航,适合复杂逻辑 - 处理带命名空间的 XML 时,必须传入 XmlNamespaceManager:
nsmgr.AddNamespace("ns", "http://example.com/ns");
var iter = navigator.Select("//ns:title", nsmgr);
用 XPathNavigator 修改 XmlDocument
XPathNavigator 支持直接编辑底层 XmlDocument,比反复用 XmlDocument 的 AppendChild/InsertBefore 更直观(尤其在已定位到某节点时):
千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使
- 先用
navigator.SelectSingleNode("//price", nsmgr)定位目标节点 - 调用
navigator.SetValue("29.99")更新文本内容 - 用
navigator.InsertElementAfter("discount", "", "10%")在当前节点后插入新元素 - 注意:所有修改会立即反映在 XmlDocument 上,无需额外“保存”步骤
注意事项和常见误区
二者结合虽方便,但要注意生命周期和线程安全:
- XPathNavigator 不是线程安全的,避免多线程共用同一个实例
- 导航器不自动跟踪 XmlDocument 后续变更(如你用 XmlDocument 新增节点,已有 navigator 不会自动感知,建议重新 CreateNavigator)
- 对大型 XML,频繁创建 navigator 开销小,但长期持有无必要;用完即弃即可
- 如果只做简单查询,XmlDocument.SelectSingleNode 已足够;XPathNavigator 的优势在于复杂导航、批量迭代或需要编辑上下文的场景
基本上就这些。用好 CreateNavigator() 这个桥接点,就能把 XmlDocument 的结构化能力和 XPathNavigator 的灵活性结合起来,查得准、改得稳。









