XPATH的用法及部分相关Demo

XPATH的用法XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文...

XPATH的用法

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。


一、XML文档的模型


对于良构的XML文档,有三种模型表示:


1、XPath数据模型


把XML文档的多数内容表示为一棵结点树,树的根结点代表文档本身,其他结点有元素结点、属性结点、文本结点、名称空间结点、注释结点等。XML声明、DOCTYPE等不能表示为结点


2、DOM


采用树形层次结构表示XML文档


3、XML信息表


把XML文档看作由信息项组成的一棵树,每个信息项相当于XPath的一个结点,信息项可有若干属性,属性值表示信息项的特性


二、结点类型


XPath中有七种结点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。文档的根节点即是文档结点;对应属性有属性结点,元素有元素结点。

  

三、运算符及特殊字符

 


  • /

  • 此路径运算符出现在模式开头时,表示应从根节点选择。

  • //

  • 从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降。

  • .

  • 当前上下文。

  • ..

  • 当前上下文节点父级。

  • *

  • 通配符;选择所有元素节点与元素名无关。(不包括文本,注释,指令等节点,如果也要包含这些节点请用node()函数)

  • @

  • 属性名的前缀。

  • @*

  • 选择所有属性,与名称无关。

  • :

  • 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。

  • ( )

  • 括号运算符(优先级最高),强制运算优先级。

  • [ ]

  • 应用筛选模式(即谓词,包括"过滤表达式"和"轴(向前/向后)")。

  • [ ]

  • 下标运算符;用于在集合中编制索引。

  • |

  • 两个节点集合的联合,如://messages/message/to | //messages/message/cc

  • -

  • 减法。

  • li,

  • 浮点除法。

  • and, or

  • 逻辑运算。

  • mod

  • 求余。

  • not()

  • 逻辑非

  • =

  • 等于

  • !=

  • 不等于

  • 特殊比较运算符

  • < 或者 &lt;

  • <= 或者 &lt;=

  • > 或者 &gt;

  • >= 或者 &gt;=

  • 需要转义的时候必须使用转义的形式,如在XSLT中,而在XMLDOM的scripting中不需要转义。


四、XPath实例


1、XML文档


 XML 代码

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
  <title>Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title>Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>


2、XPath获取值


bookstore

选取 bookstore 元素的所有子节点


/bookstore

选取根元素 bookstore注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!


bookstore/book

选取所有属于 bookstore 的子元素的 book 元素。


//book

选取所有 book 子元素,而不管它们在文档中的位置。


bookstore//book

选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。


//@lang 

选取所有名为 lang 的属性。


/bookstore/book[1]

选取属于 bookstore 子元素的第一个 book 元素。


/bookstore/book[last()]

选取属于 bookstore 子元素的最后一个 book 元素。


/bookstore/book[last()-1]

选取属于 bookstore 子元素的倒数第二个 book 元素。


/bookstore/book[position()<3]

选取最前面的两个属于 bookstore 元素的子元素的 book 元素。


//title[@lang]

选取所有拥有名为 lang 的属性的 title 元素。


//title[@lang='eng']

选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。


/bookstore/book[price>35.00]

选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。


/bookstore/book[price>35.00]/title

选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。


/bookstore/*

选取 bookstore 元素的所有子节点


//* 

选取文档中的所有元素


//title[@*]

选取所有带有属性的 title 元素。


//book/title | //book/price

选取所有 book 元素的 tilte 和 price 元素。


//title | //price

选取所有文档中的 title 和 price 元素。


/bookstore/book/title | //price

选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。


/root/child[3]

选取root元素的第三个child子元素,注意,这和数组下标不一样,从1开始计数

//child[@attr]

选取所有具有属性attr的child元素


//child[@attr="val"]/desc

选取所有属性attr的值为val的child元素的子元素desc


//child[desc]

选取所有的有desc子元素的child

 

//child[position()>3]


 position()是XPath中的一个函数,表示节点的位置

 

//child[@attr>12]

XPath表达式还可以进行数值比较,该表达式将选取attr属性值大于12的child元素


//child[last()]

last()函数返回节点列表最后的位置,该表达式将选取最后一个child元素


五、XPath在DOM,XSLT及XQuery中的应用


 HTML 代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>XPath Test</title> 
</head> 
<body> 

<script language="javascript" type="text/javascript"> 
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
xmlDoc.async="false"; 
xmlDoc.load("messages。xml"); 
xmlDoc.setProperty("SelectionLanguage", "XPath"); 
    var sPath = "/messages/message[1]//books/*[local-name()='book']"; 
var bookNodes = xmlDoc.selectNodes(sPath); 

document.write("<ul>"); 
for ( var i = 0; i < bookNodes.length; i++) { 
document.write("<li>" + bookNodes[i].childNodes[0].text + "</li>"); 
} 
document.write("</ul>"); 
</script> 

</body> 
</html>


注意:


我们若使用new ActiveXObject("Microsoft.XMLDOM")则需要注意的是:因为早期的XMLDOM的SelectionLanguage属性默认是正则表达式,不是XPath语言。所以需要指定这样一条语句xmlDoc.setProperty("SelectionLanguage", "XPath"); 以支持XPath查询表达式。.


若没有指定SelectionLanguage属性值为XPath则要注意以下情况:


数组下标从0开始(我们知道在XPath查询表达式中数组下标是从1开始的)

不支持在XPath查询表达式中使用XPath函数。

XQuery:


XQuery查询表达式:


xquery version "1.0";  


< ul >  

{  

let $i := 0  

for $x in doc("C:\Users\Administrator\Desktop\messages.xml")//message[@id=0]//books/*[local-name()='book']  

where $x/year>2006  

order by $x/year descending  

return < li >{ data($x/name) } </ li >  

}  

</ ul >

返回结果:

< ul >  
     < li >Microsoft Visual C# 2008 Step by Step </li>  
     < li >Professional C# 2008 </li>  
</ul>


评论

访客 回复该评论 2022-01-19 18:46:49
支持一下
admin 回复该评论 2022-01-21 12:53:44
支“持下‘