XPATH的用法

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 lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="eng">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>
    
    		
  • 标签: