XPath总结

参照: http://www.ibm.com/developerworks/cn/education/xml/x-introxpath2/section9.html


与所有规范一样,如果不了解使用 XPath 的方法以及何时 使用它,XPath 就没有多大价值。XPath 可以做许多事情,但是只有合理地使用,才能从中获益。必须在适当的时候使用它,在不适当的时候避免 使用它。

什么情况下适合使用XPath

XPath 是在 XML 文档中寻找特定信息的强大工具。无论是寻找元素、属性还是文本数据,良好的XPath 都可以找到所需的数据,没有什么工具像 XPath 这样快速、直观和方便。XPath 还可以简便地过滤掉不需要的元素和属性。

如果明确地掌握 XML 文档的结构,会对编写 XPath 很有帮助。/descendant-or-self::*[contains(., 'Fred')]这样的 XPath 和 //ACTOR[NAME[contains(., 'Fred')]] 这样的 XPath 在性能方面差距很大。前者非常不严密,求值过程可能会花费相当长时间,没有使用任何结构知识来提高速度。后者借助于对源文档结构的清晰认识,处理起来很容易。

什么情况下不适合使用XPath

本教程最后一节 中讨论的 SQL 式联结和查询已经接近了XPath 的功能极限。联结是可行的,这么做也没什么错;但是当 XPath的复杂性到了这种程度时,您最好考虑转而使用 XQuery。XQuery 在 XPath 的基础上提供了更多功能,比如排序、更精细的选择条件以及更完整地处理每个返回值。

另外,XPath 不是 一个转换和处理规范。它不适合执行选择之外的任何操作,包括组合文本、把数据插入字符串、把节点值连接在一起等等。XSLT是在 XPath 上构建的,XQuery 也可以执行一些格式化操作。如果更复杂的话,最好用Java 或 C#(或您喜欢的语言)API 获取XPath 的结果并用一种编程语言处理它们。IBMdeveloperWorks 上以后会有文章详细讨论这种情况。

http://www.ibm.com/developerworks/cn/education/xml/x-introxpath2/section9.html

 

1. 绝对路径定位元素:

选择根元素:以斜杠“/”开始,告诉XPATH定位器从根元素开始定位

/project

选择任意深度的节点:/project/property/main/person

绝对路径定位元素必须满足两点:

  1. 你知道你需要的person元素嵌套在main元素中,main元素又嵌套在property中,而property嵌套在project根元素中。
  2. 你只需要这个路径下的person元素,而不需要其他嵌套路径下可能存在的person元素

 

 

2. 在不知道具体嵌套路径的情况下选择元素

以双斜杠开始 “//person”:选择任何路径下的person元素。

可以两种定位方式组合在一起:“//main/person”:定位所有嵌套在main元素里面的person元素

 

3. 选择属性: /project/property/@name

a. 选择所有的name属性://@name

b. 选择特定元素的name属性://property/@name

c. 使用string函数选择属性文本值:string(/project/@default) (注意string()函数只能选择单个属性值)

 

4. 使用通配符*选择

a. 选择property元素的所有属性://property/@*

b. 选择property元素的所有子元素: //property/*

c. 选择含有某个属性的所有子元素://property/*/@name

 

5. 组合XPATH选择的结果:并集操作符:|

a. 组合两个XPath:/project/property | /project/task/property

b. 可以将不同元素组合://copy/@file | //copy/fileset

 

6. 使用谓词“[]”提高选择性

a. 选择含有某个属性的元素://target/copy[@todir]

b. 选择含有某个子元素的元素://target/copy[fileset]

c. 谓词可多层嵌套://target[java/classpath/pathelement/@path]

d. 含多个谓词的XPath://target[@depends]/jar[metainf]

 

7. 根据位置选择节点:

a. 含有depends属性的target元素的第一个java子元素://target[@depends]/java[1]

b. 选择结果集中的第一个节点:(//target[@depends]/java[1])[1]

c. 选择结果集中的最后一个节点:(//target[@depends]/java[last()])

d. 用position()函数选择位置://target[@depends]/property[position()<4]

e. position()应用于整个XPath:(//target[@depends]/property)[position()=4]

 

8. 根据属性节点值比较过滤

a. //targe[@name=’init’]

b. 用starts-with()函数测试://target[@name=’init’]/property[starts-with(@name,‘parser’)]

c. 用“.”代表可能返回的节点本身:

//target[@name=’init’]/property[starts-with(., ‘parser’)]

 

9. 比较元素节点的文本和值

a. /play/title/text()

b. 检查是否包含文本://*[contains(text(), ‘Scotland’)]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值