XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言。无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件。

本文将介绍 XPath 的一些语法。


本文读写的 XML 文件会以 文章末尾的代码 - 假设的 XML 文件 作为示例。

 

XPath 被称作 XML 路径语言,正出自于其最重要的 —— 路径表达式。

路径

  • /package/metadata/id

    • 这样的路径描述语法将可以找到 package 节点下的 metadata 节点下的 id 节点。
  • /package/metadata/*[1]

    • 使用 * 可以找到任意名称,于是这样的路径描述语法将可以找到 metadata 下第一个节点,名称是任意的。
    • 尤其要注意的是,XPath 的路径语法第一个节点从 1 开始,而不是 0。
  • /package//dependency

    • // 表示只要是前面节点的内部即可,无论中间经过了多少层。
    • 如果把 // 写到了最前面,例如 //dependency,那么表示寻找任意位置的 dependency 节点。

其实,上面的那些语法都是简写形式的语法,如果将它们完整写出来,将是这样的形式:

  • /child::package/child::metadata/child::id
  • /child::package/child::metadata/child::node()[1]
  • /child::package/descendant-or-self::dependency

这里的 childdescendant-or-self 是轴描述语法,除了这两个,还有这些:

  • child

    • 子节点 可以省略不写
  • attribute
    • 属性 可以用 @ 来缩写
  • descendant
    • 子孙节点
  • descendant-or-self
    • 自身引用及子孙节点,可以用 // 来缩写
  • parent
    • 父节点 可以用 .. 来缩写
  • ancestor
    • 祖先节点
  • ancestor-or-self
    • 自身引用及祖先节点
  • following
    • 在此节点后的所有完整节点,即不包含其祖先节点
  • preceding
    • 在此节点前的所有完整节点,即不包含其子孙节点
  • following-sibling
    • 下一个同级节点
  • preceding-sibling
    • 上一个同级节点
  • self
    • 自己 可以用 . 来缩写
  • namespace
    • 命名空间

对于 attribute 的使用,例如 //repository/@type 查找任意位置的 repository 节点的 type 属性。

节点类型

在前面的路径中,我们已经使用了 node() 来寻找元素节点,除 node() 表达式之外,还有:

  • comment()

    • 注释,也就是 <!-- 注释 -->
  • text()
    • 文字
  • processing-instruction()
    • XML 处理指令,也就是 <? 处理指令 ?>
  • node()
    • 节点

节点内容

使用中括号来描述节点的内容。

例如 //repository[@type='git'] 用来查找任意位置的 repository 节点,并且它有一个 type 属性值为 git

中括号是可以写多个的,例如:

  • //dependency[contains(@exclude, 'Build')][../group/@targetFramework='.NETStandard2.0']/@id

    • 这将查找所有满足这些条件 dependency 节点的 id 属性:

      • exclude 属性中包含 Build 字符串
      • 其父节点为 grouptargetFramework 属性为 .NETStandard2.0

运算符

  • ///.. 这是前面描述的路径运算符
  • | 用于取两个节点查找结果的并集
    • 例如 //licenseUrl | //projectUrl | //iconUrl 取任意位置的 licenseUrlprojectUrliconUrl 节点。
  • andor
    • 对两个条件取“与”或者“或”
  • not() 函数
    • 对条件取“非”
  • +-*div 以及 mod
    • 加减乘除以及取余数
  • =!=<><=>=
    • 比较相等或大小

更多函数

w3c 对 XPath 支持的函数有详细的查询页面,可以访问 XPath and XQuery Functions and Operators 3.1 查询。

在 .NET 中使用 XPath 语法

在 .NET 中使用 XPath 语法可以参考我的另一篇文章:.NET 使用 XPath 来读写 XML 文件


假设的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>MSTestEnhancer</id>
<version>1.6.0</version>
<authors>walterlv</authors>
<owners>walterlv</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<licenseUrl>https://github.com/easiwin/MSTestEnhancer/blob/master/LICENSE</licenseUrl>
<projectUrl>https://easiwin.github.io/mstest-enhancer</projectUrl>
<iconUrl>https://easiwin.github.io/mstest-enhancer/icon.png</iconUrl>
<description>MSTestEnhancer helps you to write unit tests without naming any method. You can write method contract descriptions instead of writing confusing test method name when writing unit tests.</description>
<releaseNotes>Support passing null into WithArgument method.</releaseNotes>
<copyright>Copyright (c) 2018 dotnet职业技术学院</copyright>
<repository type="git" url="https://github.com/easiwin/MSTestEnhancer.git" />
<dependencies>
<group targetFramework=".NETFramework4.5">
<dependency id="MSTest.TestFramework" version="1.2.0" exclude="Build,Analyzers" />
<dependency id="System.ValueTuple" version="4.4.0" exclude="Build,Analyzers" />
</group>
<group targetFramework=".NETFramework4.7">
<dependency id="MSTest.TestFramework" version="1.2.0" exclude="Build,Analyzers" />
</group>
<group targetFramework=".NETStandard2.0">
<dependency id="MSTest.TestFramework" version="1.2.0" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>

参考资料

XML 的 XPath 语法的更多相关文章

  1. C#操作Xml:XPath语法 在C#中使用XPath示例

    XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  2. 使用Dom4j的xPath解析xml文件------xpath语法

    官方语法地址:http//www.w3school.com.cn/xpath/index.asp xpath使用路径表达式来选取xml文档中的节点或节点集.节点是通过沿着路径(path)或者步(ste ...

  3. Dom4j使用Xpath语法读取xml节点

    我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...

  4. XDocument读取xml的所有元素以及XPath语法

    原文  http://www.cnblogs.com/xxyishutong/p/3326375.html <?xml version="1.0" encoding=&quo ...

  5. PowerShell技巧:使用XPath语法查询XML文件

    [TechTarget中国原创] XML是存储结构化数据的一个很好的途径,但是想要让数据在其中发挥作用又会有些困难.每一种语言都有其特定方式来查询XML文件中的命名空间.元素及属性.PowerShel ...

  6. Python爬虫利器三之Xpath语法与lxml库的用法

    前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...

  7. XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章

    XPath语法 在C#中使用XPath示例   XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml ve ...

  8. XPath语法 在C#中使用XPath示例

    XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml version="1.0" en ...

  9. XML的xPath格式

    XML的xPath格式(C#) xPath是XML提供的一种格式,用来查询XML的节点. <?xml version="1.0" encoding="ISO-885 ...

随机推荐

  1. 简化Kubernetes应用部署工具-Helm

    [编者的话]微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernete ...

  2. 解决msi文件在XP上安装未完成

    下载Ocra工具,然后删除"DIRCA_CheckFx"和"VSDCA_VsdLaunchConditions"这两个Action即可.第一步,下载并打开Ocr ...

  3. 初学Selenium遇到的那些坑

    一.遇到一个下拉选择框,可以点击继续选择: 所以click两次就可以了: 二.国际话问题 bdId.selectByIndex(index);//index位下拉框内容的下标,从0开始,  数组形式[ ...

  4. HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp

    题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...

  5. mongo docker image

    mongo 保存压缩镜像 docker save -o ~/Desktop/mongo.tar mongo 7za a -mx=9 ~/Desktop/mongo.tar{.7z,} 导入或拉取镜像 ...

  6. leetcode算法总结

    算法思想 二分查找 贪心思想 双指针 排序 快速选择 堆排序 桶排序 搜索 BFS DFS Backtracking 分治 动态规划 分割整数 矩阵路径 斐波那契数列 最长递增子序列 最长公共子系列 ...

  7. yii2高级模板安装

    通过 Composer 安装 如果还没有安装 Composer,在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/insta ...

  8. printf %m

    最近看别人的项目发现有 printf("%m") 这种写法,这是什么输出格式呢? 通过 man 查找得知: m (Glibc extension.) Print output of ...

  9. SQL 添加字段

    制定添加在那个字段后面 ALTER TABLE `szq`.`org_sales_daily` ADD COLUMN `trade_id_onl_count` int(11) NOT NULL DEF ...

  10. 使用Apache的ab工具进行网站性能测试

    Apache服务器自带了ab压力测试工具,可以用来测试网站性能,使用简单方便. ab 的用法是:ab [options] [http://]hostname[:port]/path 例如:ab -n ...