C#如何使用XPathNavigator高效查询XML
技术百科
幻夢星雲
发布时间:2026-01-02
浏览: 次 XPathNavigator 查询 XML 高效,推荐用 XPathDocument 创建;优先调用 MoveToXXX 方法和 Value 属性;高频查询需预编译 XPathExpression。
使用 XPathNavigator 查询 XML 在 C# 中确实高效,尤其适合只读、随机访问或需要 XPath 表达式灵活性的场景。它的核心优势在于基于光标(cursor)的快速移动和原生 XPath 支持,避免了反复加载 DOM 或构建完整对象树的开销。
前提:正确创建可导航的 XPathNavigator
不能直接 new XPathNavigator,必须从支持 XPath 的源创建。最常用的是 XPathDocument(只读、轻量、专为查询优化)或 XmlDocument(可读写但稍重):
- 推荐用
XPathDocument:构造时已内部优化索引结构,CreateNavigator()返回的 navigator 查询速度更快,内存占用更低 - 避免用
XmlDocument.CreateNavigator()做高频只读查询——它会保留完整 DOM 树,不必要地消耗内存 - 示例:
var doc = new XPathDocument("data.xml"); var nav = doc.CreateNavigator();
精准定位:用 MoveToXXX 方法代替 Select + 循环遍历
很多人习惯 Select() 返回节点集再 foreach,其实对单个目标节点,MoveToXXX 系列方法更高效(避免创建中间迭代器和节点集合):
-
nav.MoveToRoot()快速回到文档根 -
nav.MoveToFirstChild()、nav.MoveToNext()、nav.MoveToParent()等做局部移动,开销极小 - 若已知路径如
/bookstore/book[1]/title,直接nav.SelectSingleNode("/bookstore/book[1]/title")比先 Select 再取 [
0] 更快
高效提取值:优先用 Value 属性,慎用 InnerXml/OuterXml
获取文本内容时,Value 属性返回合并后的纯文本(自动跳过注释、处理指令等),性能远高于 InnerXml(需序列化子节点):
- 要取元素内容(如
的 "29.99")→ 用29.99 nav.Value - 要取带格式的子 XML 字符串 → 才用
InnerXml,但注意它触发序列化,有额外开销 - 用
GetAttribute("name", "")直接取属性值,比先定位属性节点再读 Value 更简洁
批量查询:用 Compile + Execute 预编译 XPath 表达式
如果同一 XPath 表达式在循环中多次执行(比如查 1000 个 book 的 author),务必预编译,避免每次解析字符串:
XPathExpression expr = XPathExpression.Compile("//book/author");- 之后循环中:
nav.Select(expr)或nav.SelectSingleNode(expr) - 预编译后执行速度提升明显,尤其复杂表达式;且可复用,线程安全
# 的是
# 很多人
# 它会
# 更快
# 跳过
# 最常用
# 专为
# 循环
# 对象
# 内存占用
# c#
# xml
# 字符串
# 线程
# var
# node
# foreach
# select
# 遍历
# dom
# 更低
# 才用
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python网页解析流程_html结构说明【指导】
- Python包结构设计_大型项目组织解析【指导】
- 如何从 Go 的 map[string]inter
- Win11任务栏怎么固定应用 Win11将软件图标
- 静态属性修改会影响所有实例吗_php作用域操作符下
- 如何使用Golang理解结构体指针方法接收者_Go
- php嵌入式多设备通信怎么实现_php同时管理多个
- windows如何备份注册表_windows导出和
- Windows10如何更改系统字体大小_Win10
- php485函数执行慢怎么优化_php485性能提
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- LINUX的SELinux是什么_详解LINUX强
- PHP的Workerman对架构扩展有啥帮助_应用
- 如何诊断并终止卡死的 multiprocessin
- Win11如何设置系统声音_Win11系统声音调整
- c# 如何深拷贝和浅拷贝
- Python文件管理规范_工程实践说明【指导】
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- mac怎么安装字体_MAC添加第三方字体与字体册管
- Win10如何备份驱动程序_Win10驱动备份步骤
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Windows10系统怎么查看运行时间_Win10
- php在Linux怎么部署_LNMP环境搭建PHP
- 如何在 Django 中修改用户密码后保持会话不丢
- Windows7怎么找回经典开始菜单_Window
- php怎么捕获异常_trycatch结构处理运行时
- Win11无法拖拽文件到任务栏怎么办_Win11开
- 如何使用Golang进行HTTP服务性能测试_测量
- Win11怎么开启智能存储_Windows11存储
- 网站内页做seo排名怎么做?
- 如何在Golang中实现基础配置管理功能_Gola
- Windows 11如何开启文件夹加密(EFS)_
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- Win11怎么设置任务栏图标大小_Windows1
- PHP中require语句后直接调用返回对象方法的
- Win11怎么开启上帝模式_创建Windows 1
- php修改数据怎么改富文本_update更新htm
- php做exe支持多线程吗_并发处理实现方式【详解
- Windows10如何彻底关闭自动更新_Win10
- Windows10如何更改盘符名称_Win10重命
- Win11开机Logo怎么换_Win11自定义启动
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Win11怎么更改鼠标指针方案_Windows11
- Win11怎么开启HDR模式_Windows 11
- c++ reinterpret_cast怎么用 c
- Win10路由器怎么隐藏ssid Win10隐藏w
- c++中explicit(bool)的用法 c++
- Win11怎么设置右键刷新选项_Windows11
- 如何在Golang中实现微服务负载均衡_Golan
- Win11如何更改任务栏颜色 Win11自定义任务

0] 更快
QQ客服