博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XmlDocument的XPath操作
阅读量:6354 次
发布时间:2019-06-22

本文共 2450 字,大约阅读时间需要 8 分钟。

某个客户询问我关于SelectSingleNode和SelectNodes的XPath操作,问题如下:

【xml】

Tansion
Herry
Jack

现在他要求“筛选出所有名称为dsobject,classname等于Rendition”,输出其contentelement的数据。

他这样做:

[C#]

foreach (XmlNode item in document.SelectNodes("//dsobject[@classname='Rendition']")){  XmlNode oneNode = item.SelectSingleNode("//contentelement");  string inner = oneNode.InnerText;}

[VB.NET]

For Each item As XmlNode In document.SelectNodes("//dsobject[@classname='Rendition']")	Dim oneNode As XmlNode = item.SelectSingleNode("//contentelement")	Dim inner As String = oneNode.InnerTextNext

粗看先是从xml文档全部选出classname属性值为Rendition的全部dsobject(外循环),内部再从每个dsobject节点内部筛选出contentelement节点并输出包含的数值。但是实际上输出的结果只是三个“Tansion”。

究其原因,是因为XPath语法的特殊性:凡是以“//”开头的,都是无条件以整个xml的根节点开始遍历的。因此item.SelectSingleNode不要误以为是接着上面的dsobject节点往下检索,而是从头开始的!因此遍历的时候总是遍历到第一个dsobject中的contentelement的内部数值。

同样地,凡是以“/”开头的,都是无条件人为指定从根节点开始的绝对路径搜索,与XmlNode上下文毫无关系(比如要查询第一个contentelement,用绝对路径甚至可以这样写):

[C#]

Console.WriteLine(document.SelectSingleNode("/root/dsobject/contentelements/contentelement").InnerText); Console.WriteLine(document.DocumentElement.SelectSingleNode("/root/dsobject/contentelements/contentelement").InnerText);

[VB.NET]

Console.WriteLine(document.SelectSingleNode("/root/dsobject/contentelements/contentelement").InnerText)Console.WriteLine(document.DocumentElement.SelectSingleNode("/root/dsobject/contentelements/contentelement").InnerText)

显然,以/开头无论XmlNode是什么,总是被忽略且从指定的root=>dsobject=>contentelements=>contentment这样的顺序开始检索(绝对路径)。

至于和上下文相关的,就是直接写名字;比如:

[C#]

Console.WriteLine(document.SelectSingleNode("root/dsobject/contentelements/contentelement").InnerText);Console.WriteLine(document.DocumentElement.SelectSingleNode("dsobject/contentelements/contentelement").InnerText);

[VB.NET]

Console.WriteLine(document.SelectSingleNode("root/dsobject/contentelements/contentelement").InnerText)Console.WriteLine(document.DocumentElement.SelectSingleNode("dsobject/contentelements/contentelement").InnerText

显然,document的根节点是“#document”(特殊节点,xml中不存在),那么相对它而言下面的节点是root/dsobject/contentelments/contentelement。不过document.DocumentElement本身就是root,因此第二句代码中root就不能再写了,不然会发生找不到节点(因为不存在root=>root=>……这样的节点)。

SelectNodes也符合这样的特点,这里就不再叙述了。

转载于:https://www.cnblogs.com/ServiceboyNew/archive/2012/05/13/2498444.html

你可能感兴趣的文章
Freebsd的ports命令
查看>>
分布式系统---幂等性设计
查看>>
【转】时钟周期,机器周期,指令周期的区别
查看>>
MYSQL 更新时间自己主动同步与创建时间默认值共存问题
查看>>
android 屏幕适配
查看>>
Android Activity的4种启动模式
查看>>
leetcode第一刷_Minimum Depth of Binary Tree
查看>>
pm2-webshell —— 基于浏览器的终端控制台
查看>>
Mysql基准测试
查看>>
Session 撰改演示
查看>>
【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)
查看>>
事务隔离级别(图文详解)
查看>>
canvas系列教程08-canvas各种坑
查看>>
浅析package.json中的devdependencies 和 dependencies
查看>>
又一个 iOS 侧边栏组件: SideMenu
查看>>
vue.js 打包遇到的问题
查看>>
【译】更优秀的GraphQL官方中文文档-客户端如何使用
查看>>
git pull遇到的问题
查看>>
eclipse下maven spring项目环境配置
查看>>
无缝轮播
查看>>