分享到:

现在做的一个ASP.NET项目由于需要操纵XML进行一些处理,所以花了半天时间学习了下XPath的语法。但是ASP.NET所使用的VBScript语言在直接使用部分XPath语法的时候会报错,例如:

selectNodes("child::TYPE")

报错:

日本語:

80004005 必要なトークン ‘eof’ が ‘:’ を検出しました。 child–>:<–:

English:

80004005 Expected token ‘EOF’ found ‘:’. child–>:<–:

此错误中文信息未知。

这些语法在微软官方网站也是可以查到的,比如XmlNode.SelectNodes 方法 (String)的示例中,也出现了

nodeList=root.SelectNodes("descendant::book[author/last-name='Austen']")

的句子。不过考虑VBS和VB语言规范并不完全一致,所以也只能考虑是其它出错。

之后在查资料的时候,发现XPath的位置路径是可以有简写的方式的,可以省略掉冒号这一部分,如果使用简写方式,可能会跳过冒号报错的这一情况。

以下内容搬运自微软MSDN位置路径 (XPath)

位置路径是一种 XPath 表达式,用于选择相对于上下文节点的一组节点。  计算位置路径表达式所得到的节点集,将包含位置路径指定的节点。  位置路径可以以递归方式包含表达式,用来筛选节点集。

在语法上,位置路径由一个或多个定位步骤组成,每个步骤通过正斜杠 (/) 分隔:

复制

locationstep/locationstep/locationstep

每个定位步骤依次选择相对于上下文节点(即上一个定位步骤所选择的节点)的一组节点。  通过这种方式表示的位置路径为相对位置路径。  绝对位置路径从根元素开始:

复制

/locationstep/locationstep/locationstep

在位置路径中,定位步骤从左到右进行计算。  最左侧的定位步骤选择一组相对于上下文节点的节点。  然后,这些节点成为上下文节点,用于处理下一个定位步骤。  这种步骤的处理和上下文节点的更新自行重复,直到所有定位步骤处理完毕。

位置路径可以缩写,也可以不缩写。

在不缩写的位置路径中,定位步骤采用以下语法:

复制

axis::node-test[predicate]

在此语法中,axis 指定定位步骤选择的节点与上下文节点的关系;node-test 指定定位步骤选择的节点的节点类型和扩展名称;predicate 是一个筛选表达式,进一步精确定位步骤中的节点选择。  谓词是可选的。  在此例中,定位步骤仅包含 axis::node-test  下表提供了一些示例。

不缩写的位置路径

描述

child::para[last()]

选择上下文节点的最后一个 <para> 元素。

parent::para

选择属于上下文节点父级的 <para> 元素。

child::text()

选择上下文节点的所有文本节点子级。

child::div/child::para

选择属于上下文节点子级的 <div> 元素的 <para> 子元素。

在缩写的位置路径中,轴指定符 axis:: 在定位步骤中未明确表达,而是通过一组快捷方式暗示。  下表提供了一些示例。

缩写的位置路径

描述

para

选择上下文节点的 <para> 元素。

../para

选择属于上下文节点父级的 <para> 元素。

text()

选择上下文节点的所有文本节点子级。

./div/para

选择上下文节点的 <div> 元素子级的 <para> 元素子级。

下面总结了一些缩写:

不缩写

缩写

child::*

*

attribute::*

@*

/descendant-or-self::node()

//

self::node()

.

parent::node()

..

以下内容搬运自礼拜一的博客【成为自己比什么都重要!】-XPath表达式(缩写和详写方式)

Xpath是XSLT(Extensible Stylesheet Language for Transformations,可扩展样式表语言)用到的表达式语法,用于定位XSLT文档中元素的位置。

Xpath定位寻址有两种语法:一种未经缩写的语法和一种缩写的语法。未经缩写的语法可以很清晰的表达出定位路径的含义,对于开始阶段学习理解一些概念非常有帮助。大多数开发人员都使用缩写的语法,这样开发效率更高。

一个定位步骤包含3个部分:轴(axis)、节点测试和谓词(predicate).轴和节点测试通过一个双冒号(::)来分开,他们都是必须 的。而谓词可选的,如果指定了谓词,那么它就必须紧接着节点测试,并且由中括号([])括起来。定位路径中的每一个定位步骤都是由一个斜杠(/)分开的。 如果节点的查找开始于根节点(绝对路径),第一个定位步骤也开始于一个斜杠。

下面写出一些常用的Xpath语法:

1.       含义:选择文档的根
未缩写的语法:/
缩写的语法:/

2.       含义:选择当前节点的子节点中的所有para元素节点
未缩写的语法:child::para
缩写的语法:    para

3.       含义:选择根节点中的子节点的所有para元素节点(注意与上一个例子的区别)
未缩写的语法:/child::para
缩写的语法:    /para

4.       含义:选择当前节点的后代节点中的所有para元素节点
未缩写的语法:descendant::para
缩写的语法:    .//para

5.       含义:选择根节点的后代节点中所有para元素节点(注意与上一个例子的区别)
未缩写的语法:/descendant::para
缩写的语法:    //para

6.       含义:选择当前节点的所有id属性
未缩写的语法:attribute::id
缩写的语法:    @id

7.       含义:选择当前节点的所有属性
未缩写的语法:attribute::*
缩写的语法:    @*

8.       含义:选择当前节点的子节点中的第五个chapter元素节点
未缩写的语法:child::chapter[position()=5]
缩写的语法:    chapter[5]

9.       含义:选择当前节点的子节点中id值为this-one的所有chapter元素节点
未缩写的语法:child::chapter[attribute::id=”this-one”]
缩写的语法:    chapter[@id=”this-one”]

10.   含义:选择属性值不为y的所有chapter元素节点
未缩写的语法:child::chapter[not(attribute::include=”y”)]
缩写的语法:    chapter[@include =”y”]

11.   含义:选择根节点中的后代中的所有文本节点(也就是文档中所有的文本节点)
未缩写的语法:/descendant::text()
缩写的语法:    //text()

12.   含义:选择当前节点的子节点中的num属性值为1,draft属性值为y的所有part节点
未缩写的语法:child::part[attribute::num=”1″] [attribute::draft=”y”]
缩写的语法:    chapter[@num =”1″] [@draft =”y”]

13.   含义:选择当前节点的父节点,如果该父节点由include属性且值为y
未缩写的语法:parent::node()[attribute::include=”y”]  
缩写的语法:    .. [@include =”y”]

14.   含义:选择同时具有id属性和include属性的所有chapter元素节点(不管属性值是什么)
未缩写的语法:/descendant::chapter[attribute::id and attribute::include]  
缩写的语法:    //chapter[@id and @include]