XPath语法详解

  • XPath 示例

本主题回顾整个 XPath 参考中出现的语法示例。所有示例均基于本节后所附 《XPath 语法的示例 XML 文件》。

表达式 引用
./author

当前上下文中的所有 <author> 元素。注意,此表达式等效于下一行中的表达式。

author

当前上下文中的所有 <author> 元素。

first.name

当前上下文中的所有 <first.name> 元素。

/bookstore

本文档的文档元素 (<bookstore> )。

//author

文档中的所有 <author> 元素。

book[/bookstore/@specialty = @style]

style 属性值等于文档根目录的 <bookstore> 元素的 specialty 属性值的所有 <book> 元素。

author/first-name

属于 <author> 元素的子级的所有 <first-name> 元素。

bookstore//title

<bookstore> 元素中更深的一级或多级(任意子代)的所有 <title> 元素。注意,此表达式不同于下一行中的表达式。

bookstore/*/title

属于 <bookstore> 元素的孙级的所有 <title> 元素。

bookstore//book/excerpt//emph

<book> 元素的 <excerpt> 子级中的任意位置和 <bookstore> 元素中的任意位置的所有 <emph> 元素。

.//title

当前上下文中更深的一级或多级的所有 <title> 元素。注意,本质上只有这种情况需要句点表示法。

author/*

属于 <author> 元素的子级的所有元素。

book/*/last-name

属于 <book> 元素的孙级的所有 <last-name> 元素。

*/*

当前上下文的所有孙级元素。

*[@specialty]

具有 specialty 属性的所有元素。

@style

当前上下文的 style 属性。

price/@exchange

当前上下文中 <price> 元素的 exchange 属性。

price/@exchange/total

返回空节点集,因为属性不包含元素子级。XML 路径语言 (XPath) 语法允许使用此表达式,但是严格意义上讲无效。

book[@style]

当前上下文的具有 style 属性的所有 <book> 元素。

book/@style

当前上下文的所有 <book> 元素的 style 属性。

@*

当前元素上下文的所有属性。

./first-name

当前上下文节点中的所有 <first-name> 元素。注意,此表达式等效于下一行中的表达式。

first-name

当前上下文节点中的所有 <first-name> 元素。

author[1]

当前上下文节点中的第一个 <author> 元素。

author[first-name][3]

具有 <first-name> 子级的第三个 <author> 元素。

my:book

my 命名空间中的 <book> 元素。

my:*

my 命名空间中的所有元素。

@my:*

my 命名空间中的所有属性(不包括 my 命名空间中的元素的未限定属性)。

 

注意,索引相对于父级。考虑以下数据:

Xml代码   收藏代码
  1. <x>  
  2.     <y />  
  3.     <y />  
  4. </x>  
  5. <x>  
  6.     <y />  
  7.     <y />  
  8. </x>  
 
表达式 引用
x/y[1]

每个 <x> 的第一个 <y> 子级。此表达式等效于下一行中的表达式。

x/y[position() = 1]

每个 <x> 的第一个 <y> 子级。

(x/y)[1]

<x> 元素的整个 <y> 子级元素集中的第一个 <y> 。

x[1]/y[2]

第一个 <x> 的第二个 <y> 子级。

 

其他示例引用 《XPath 语法的示例 XML 文件》。

表达式 引用

book[last()]

当前上下文节点的最后一个 <book> 元素。

book/author[last()]

当前上下文节点的每个 <book> 元素的最后一个 <author>子级。

(book/author)[last()]

当前上下文节点的 <book> 元素的整个 <author> 子级元素集中的最后一个 <author> 元素。

book[excerpt]

至少包含一个 <excerpt> 元素子级的所有 <book> 元素。

book[excerpt]/title

属于 <book> 元素(也至少包含一个 <excerpt> 元素子级)的子级的所有 <title> 元素。

book[excerpt]/author[degree]

至少包含一个 <degree> 元素子级并且属于 <book> 元素(也至少包含一个 <excerpt> 元素)子级的所有<author> 元素。

book[author/degree]

所有包含 <author> 子级的 <book> 元素,该子级至少包含一个 <degree> 子级。

author[degree][award]

至少包含一个 <degree> 元素子级以及至少包含一个<award> 元素子级的所有 <author> 元素。

author[degree and award]

至少包含一个 <degree> 元素子级以及至少包含一个<award> 元素子级的所有 <author> 元素。

author[(degree or award) and publication]

至少包含一个 <degree> 或 <award> 以及至少包含一个<publication> 子级的所有 <author> 元素。

author[degree and not(publication)]

至少包含一个 <degree> 元素子级并且不包含<publication> 元素子级的所有 <author> 元素。

author[not(degree or award) and publication]

至少包含一个 <publication> 元素子级并且不包含<degree> 和 <award> 元素子级的所有 <author> 元素。

author[last-name = "Bob"]

至少包含一个值为 Bob 的 <last-name> 元素子级的所有<author> 元素。

author[last-name[1] = "Bob"]

第一个 <last-name> 子元素的值为 Bob 的所有 <author>元素。注意,此表达式等效于下一行中的表达式。

author[last-name [position()=1]= "Bob"]

第一个 <last-name> 子元素的值为 Bob 的所有 <author>元素。

degree[@from != "Harvard"]

from 属性不等于 "Harvard" 的所有 <degree> 元素。

author[. = "Matthew Bob"]

所有值为 Matthew Bob 的 <author> 元素。

author[last-name = "Bob" and ../price &gt; 50]

包含值为 Bob 的 <last-name> 子元素以及值大于 50 的<price> 同辈元素的所有 <author> 元素。

book[position() &lt;= 3]

前三本书(1、2、3)。

author[not(last-name = "Bob")]

不包含值为 Bob 的 <last-name> 子元素的所有 <author>元素。

author[first-name = "Bob"]

至少包含一个值为 Bob 的 <first-name> 元素的所有<author> 元素。

author[* = "Bob"]

所有包含任何值为 Bob 的子元素的 author 元素。

author[last-name = "Bob" and first-name = "Joe"]

所有包含值为 Bob 的 <last-name> 子元素和值为 Joe 的<first-name> 子元素的 <author> 元素。

price[@intl = "Canada"]

上下文节点中所有 intl 属性等于 "Canada" 的 <price> 元素。

degree[position() < 3]

属于上下文节点子级的前两个 <degree> 元素。

p/text()[2]

上下文节点中每个 <p> 元素的第二个文本节点。

ancestor::book[1]

与上下文节点最接近的 <book> 上级。

ancestor::book[author][1]

与上下文节点最接近的 <book> 上级,并且此 <book> 元素包含 <author> 元素子级。

ancestor::author[parent::book][1]

当前上下文中最接近的 <author> 上级,并且此 <author>元素是 <book> 元素的子级。

 

 

附: 《XPath 语法的示例 XML 文件》

Xml代码   收藏代码
  1. <?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl" href="myfile.xsl" ?>  
  3. <bookstore specialty="novel">  
  4.     <book style="autobiography">  
  5.         <author>  
  6.             <first-name>Joe</first-name>  
  7.             <last-name>Bob</last-name>  
  8.             <award>Trenton Literary Review Honorable Mention</award>  
  9.         </author>  
  10.         <price>12</price>  
  11.     </book>  
  12.     <book style="textbook">  
  13.         <author>  
  14.             <first-name>Mary</first-name>  
  15.             <last-name>Bob</last-name>  
  16.             <publication>  
  17.                 Selected Short Stories of  
  18.                 <first-name>Mary</first-name>  
  19.                 <last-name>Bob</last-name>  
  20.             </publication>  
  21.         </author>  
  22.         <editor>  
  23.             <first-name>Britney</first-name>  
  24.             <last-name>Bob</last-name>  
  25.         </editor>  
  26.         <price>55</price>  
  27.     </book>  
  28.     <magazine style="glossy" frequency="monthly">  
  29.         <price>2.50</price>  
  30.         <subscription price="24" per="year" />  
  31.     </magazine>  
  32.     <book style="novel" id="myfave">  
  33.         <author>  
  34.             <first-name>Toni</first-name>  
  35.             <last-name>Bob</last-name>  
  36.             <degree from="Trenton U">B.A.</degree>  
  37.             <degree from="Harvard">Ph.D.</degree>  
  38.             <award>Pulitzer</award>  
  39.             <publication>Still in Trenton</publication>  
  40.             <publication>Trenton Forever</publication>  
  41.         </author>  
  42.         <price intl="Canada" exchange="0.7">6.50</price>  
  43.         <excerpt>  
  44.             <p>It was a dark and stormy night.</p>  
  45.             <p>  
  46.                 But then all nights in Trenton seem dark and stormy to  
  47.                 someone who has gone through what  
  48.                 <emph>I</emph>  
  49.                 have.  
  50.             </p>  
  51.             <definition-list>  
  52.                 <term>Trenton</term>  
  53.                 <definition>misery</definition>  
  54.             </definition-list>  
  55.         </excerpt>  
  56.     </book>  
  57.     <my:book xmlns:my="uri:mynamespace" style="leather" price="29.50">  
  58.         <my:title>Who's Who in Trenton</my:title>  
  59.         <my:author>Robert Bob</my:author>  
  60.     </my:book>  
  61. </bookstore>  


引自 http://jiangzhengjun.iteye.com/blog/483048



XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

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>

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

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

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/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。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。


引自 http://www.w3school.com.cn/xpath/xpath_syntax.asp



XPath 表达式的上下文

.NET Framework 4.5
此主题尚未评级 评价此主题

XPath 表达式的计算取决于运算表达式所针对的上下文。 上下文包括计算表达式所针对的节点及其关联的环境,包括下列内容:

  • 上下文节点相对于同辈节点的位置(按文档顺序)。

  • 上下文的大小 — 即上下文节点的同辈节点数加 1。

  • 可以解析变量引用的变量绑定。

  • 函数库。

  • 表达式范围中的命名空间声明。

为了更好地评价上下文的概念,请考虑包含节点的树。 向树根请求所有名为 X 的节点时,将返回一个结果集,而向树枝请求这些节点时,将返回不同的结果集。 因此,表达式的结果取决于执行表达式所针对的上下文。

XPath 表达式可以在一个特定的上下文匹配特定的模式,返回结果,然后相对于所返回节点的上下文执行其他运算。 这样,在整个文档树中进行搜索时,使用 XPath 表达式非常灵活。

以下是基本的 XPath 表达式类型。 每一类型都在下面进行了描述。

  • 当前上下文

  • 文档根

  • 根元素

  • 递归下降

  • 特定元素

示例

下面的示例显示一些基本的 XPath 表达式。 通过将这些简单的表达式组合在一起,并使用各种 XPath 运算符和特殊字符,可以生成更复杂的表达式。

当前上下文

以句点和正斜杠 (./) 作为前缀的表达式明确使用当前上下文作为上下文。 例如,下面的表达式引用当前上下文内的所有 <author> 元素:

./author

注意,此表达式等效于以下表达式:

author
文档根

以正斜杠 (/) 为前缀的表达式使用文档树的根作为上下文。 例如,下面的表达式引用此文档根处的 <bookstore> 元素:

/bookstore
根元素

使用正斜杠后接星号 (/*) 的表达式将使用根元素作为上下文。 例如,以下表达式查找文档的根元素:

/*
递归下降

使用双正斜杠 (//) 的表达式指示可以包括零个或多个层次结构级别的搜索。 如果此运算符出现在模式的开头,上下文相对于文档的根。 例如,下面的表达式引用当前文档内任何位置的所有 <author> 元素:

//author

.// 前缀指示上下文从层次结构中当前上下文所指示的级别开始。

特定元素

以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。 例如,下面的表达式引用当前上下文节点中 <images> 元素内的 <background.jpg> 元素:

images/background.jpg

下面的表达式引用当前上下文节点中 <bookstore> 元素内 <book> 元素的集合。

bookstore/book

下面的表达式引用当前上下文节点中所有的 <first.name> 元素:

first.name
注意注意

元素名可以包括句点字符 (.)。这些名称的用法与任何其他名称一样。


运算符和特殊字符

.NET Framework 4.5
1(共 1)对本文的评价是有帮助 评价此主题

XPath 表达式是使用下表中所示的运算符和特殊字符构造的。

/

子运算符;选择左侧集合的直接子级。 此路径运算符出现在模式开头时,表示应从根节点选择该子级。

//

递归下降;在任意深度搜索指定元素。 此路径运算符出现在模式开头时,表示应从根节点递归下降。

.

指示当前上下文。

..

当前上下文节点的父级。

*

通配符;选择所有元素,与元素名无关。

@

属性;属性名的前缀。

@*

属性通配符;选择所有属性,与名称无关。

:

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

( )

为运算分组,明确设置优先级。

[ ]

应用筛选模式。

[ ]

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

+

执行加法。

-

执行减法。

div

根据 IEEE 754 执行浮点除法。

*

执行乘法。

mod

从截断除法返回余数。

此表不包括布尔运算符和集运算符,这两个运算符在布尔、比较和集表达式集运算中列出。

优先级顺序(从最高优先级到最低优先级)的定义如下表所示。

优先级

字符

用途

1

( )

分组

2

[ ]

筛选器

3

/ //

路径运算

分组运算符 () 仅适用于顶级路径表达式。 例如,(//author/degree | //author/name) 是有效的分组运算,但 //author/(degree | name) 不是。

筛选模式运算符 ([]) 的优先级高于路径运算符(/ 和 //)。 例如,表达式 //comment()[3] 选择相对于文档中任意位置备注的父级索引等于 3 的所有备注。 此表达式与表达式(//comment())[3] 不同,后者选择相对于父级的所有备注集中的第三个备注。 前一个表达式可以返回多个备注,后一个表达式只能返回一个备注。

这些运算符和特殊字符在本参考文档中详细说明。

特定类型的元素集合可以使用路径运算符(/ 和 //)确定。 这些运算符根据其参数的“左侧”集合进行选择,“右侧”集合表示要选择的元素。 子运算符 (/) 从左侧集合的直接子级中选择,而子代运算符 (//) 从左侧集合的任意子代中选择。 因此,// 可以作为一个或多个层次结构级别的替代。

注意,路径运算符在执行查询时更改上下文。 通过将路径运算符连接在一起,用户可以遍历文档树。

表达式

引用

author/first-name

当前上下文节点的 <author> 元素中的所有 <first-name> 元素。

bookstore//title

<bookstore> 元素中一级或多级深度的所有 <title> 元素(任意后代)。 注意,此表达式与以下模式 bookstore/*/title 不同。

bookstore/*/title

作为 <bookstore> 元素的孙代的所有 <title> 元素。

bookstore//book/excerpt//emph

<book> 元素的 <excerpt> 子级中的任意位置和 <bookstore> 元素中的任意位置的所有 <emph> 元素:

.//title

当前上下文中一级或多级深度的所有 <title> 元素。 注意,本质上只有这种情况需要句点表示法。

通过使用通配符 (*) 集合,不使用元素名即可引用元素。 * 集合引用作为当前上下文的子级的所有元素,与名称无关。

示例

表达式

引用

author/*

<author> 元素的所有元素子级。

book/*/last-name

所有作为 <book> 元素孙代的 <last–name> 元素。

*/*

当前上下文的所有孙级元素。

my:book

my 命名空间中的 <book> 元素。

my:*

my 命名空间中的所有元素。

注意,不支持模式 *:book

XPath 使用 @ 符号表示属性名。 属性和子元素应公平对待,两种类型之间的功能应尽可能相当。

注意 注意

属性不能包含子元素,所以,如果对属性应用路径运算符,将出现语法错误。 此外,不能对属性应用索引,因为根据定义,不为属性定义任何顺序。

示例

表达式

引用

@style

当前元素上下文的 style 属性。

price/@exchange

当前上下文内的 <price> 元素的 exchange 属性。

book/@style

所有 <book> 元素的 style 属性。

注意,以下示例无效,因为属性不能包含任何子级。

price/@exchange/total

使用 @* 可以返回某个元素的所有属性。 对于将属性作为记录中的字段的应用程序,此表达式可能非常有用。

示例

表达式

引用

@*

当前上下文节点的所有属性。

@my:*

my 命名空间中的所有属性。 不包括 my 命名空间中的元素的未限定特性。

注意,不支持模式 @*:title

更加详细内容见微软网站 http://msdn.microsoft.com/zh-cn/library/ms256471(v=vs.110).aspx


Dom4j使用xpath的例子

下面的例子是取出子文件夹的ID和文件夹名的集合

import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * Test App
 *
 */
public class App 
{
    
	public static void main( String[] args ) throws DocumentException
    {
    	xpathTest();
    }
    
	/**
	 * XPath syntax test method
	 * @throws DocumentException
	 */
	@SuppressWarnings("rawtypes")
    private static void xpathTest() throws DocumentException {
    	SAXReader reader = new SAXReader();
        Document document = reader.read("d:/2.xml");
    	Element root = document.getRootElement();
    	
    	String xpath = "/folder/fields/folder";
    	
    	List lstNodes = root.selectNodes(xpath);
    	
    	for (Iterator ir = lstNodes.iterator(); ir.hasNext(); ) {
    		Element elm = (Element)ir.next();
    		
    		System.out.println(elm.attributeValue("id"));
    		
    		System.out.println(elm.selectSingleNode("fields/field[@name='NAME']").getText());
    	}
    }
}

上面例子用的2.xml如下
<?xml version="1.0"?>
<folder id="1091" type="None">
   <fields>
       <field name="NAME">General</field>
       <folder id="1092" >
	    <fields>
	         <field name="NAME">Test01</field>
	    </fields>
       </folder>
       <folder id="1093" >
	    <fields>
	         <field name="NAME">Test02</field>
	    </fields>
       </folder>
   </fields>
</folder>



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值