当前位置: 首页 > news >正文

XML 的 XPath 语法

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>

参考资料

  • XPath - 维基百科,自由的百科全书

相关文章:

  • .NET 使用 XPath 来读写 XML 文件
  • 像黑客一样!Chrome 完全键盘操作指南(原生快捷键 + Vimium 插件)
  • 如何在 .NET 库的代码中判断当前程序运行在 Debug 下还是 Release 下
  • 在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中
  • WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
  • 理解 Roslyn 中的红绿树(Red-Green Trees)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • WPF 应用完全模拟 UWP 的标题栏按钮
  • 让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制
  • 在 GitHub 公开仓库中隐藏自己的私人邮箱地址
  • Win32 程序在启动时激活前一个启动程序的窗口
  • C#/.NET 读取或修改文件的创建时间和修改时间
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 4. 路由到控制器 - Laravel从零开始教程
  • eclipse(luna)创建web工程
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • express.js的介绍及使用
  • Github访问慢解决办法
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • MobX
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • php的插入排序,通过双层for循环
  • session共享问题解决方案
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 两列自适应布局方案整理
  • 聊聊sentinel的DegradeSlot
  • 前端性能优化——回流与重绘
  • 事件委托的小应用
  • 无服务器化是企业 IT 架构的未来吗?
  • 一道面试题引发的“血案”
  • 一起参Ember.js讨论、问答社区。
  • 用element的upload组件实现多图片上传和压缩
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 阿里云API、SDK和CLI应用实践方案
  • 容器镜像
  • 说说我为什么看好Spring Cloud Alibaba
  • 昨天1024程序员节,我故意写了个死循环~
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • !!java web学习笔记(一到五)
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (6)STL算法之转换
  • (LeetCode 49)Anagrams
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (六)c52学习之旅-独立按键
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转载)(官方)UE4--图像编程----着色器开发
  • (轉)JSON.stringify 语法实例讲解
  • **CI中自动类加载的用法总结