切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
HTML
正则表达式
Json
包管理工具
vite
CSS
XPath
JavaScript
Jquery
less
ES6
Vue
React
vue 3
Layui
editor.md
sea.js
Zepto.js
mysql.js
mssql.js
NodeJs
Express
前端template
YAML
杂项
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
前端
XPath 术语、语法及路径表达式使用说明
[TOC] ## 1. XPath 是什么 XPath 是一门在 XML 文档中查找信息的语言,它使用路径表达式在 XML 文档中进行导航(XPath 使用路径表达式来选取 XML 文档中的节点或者节点集),它有标准函数库,它也是是一个 W3C 标准 ## 2. 节点 ### 2.1. XPath 术语 #### 2.1.1. 节点 在 XPath 中,有七种类型的节点:`元素`、`属性`、`文本`、`命名空间`、`处理指令`、`注释`以及`文档(根)节点`。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点 **XML 基础文档代码结构如下:** ```XML <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> ``` **上面的XML文档中的节点例子:** + 文档节点/根节点:`<bookstore>` + 元素节点:`<author>J K. Rowling</author>` + 属性节点:`lang="en"` #### 2.1.2. 基本值/原子值 基本值是指那些不能进一步分解为其他元素的元素值 + 元素内容:在XML中,元素可以包含文本内容,这些文本内容被称为元素的内容。有些元素的内容可能只是简单的文本,没有嵌套的其他元素。这些元素的内容就被认为是基本值 + 属性内容:在XML中,元素属性的值也是一个简单的文本,不能进行分解了,所以属性值也是基本值 本文中第2.1.1.章节中的XML文档中:`Harry Potter`、`en`都是基本值 #### 2.1.3. 项目 在 XPath 中所说的项目指的就是节点和基本值 ### 2.2. 节点关系 + 父节点(Parent):一个节点下面还存在节点元素,则这个节点可称作父节点,一般根节点都是父节点,本文中第2.1.1.章节中的XML结构中 book 元素是 title、author、year 以及 price 元素的父节点 + 子节点(Children):元素节点可有零个、一个或多个子节点,本文中第2.1.1.章节中的XML结构中,title、author、year 以及 price 元素都是 book 元素的子: + 同胞节点(Sibling):拥有相同的父的节点,本文中第2.1.1.章节中的XML结构中,title、author、year 以及 price 元素都是同胞节点 + 先辈节点(Ancestor):某节点的父、父的父,等等,本文中第2.1.1.章节中的XML结构中,title 元素的先辈是 book 元素和 bookstore 元素 + 后代节点(Descendant):某个节点的子,子的子,等等,本文中第2.1.1.章节中的XML结构中,bookstore 的后代是 book、title、author、year 以及 price 元素 ## 3. XPath 语法 ### 3.1. XPath 路径表达式 XPath 使用路径表达式在 XML 文档中选取节点,节点是通过沿着路径或者 step 来选取的,下面是一些常用的路径表达式示例 **示例数据源:** ```XML <People> <row> <Id>9</Id> <Name lang="en">Joy</Name> <Sex>0</Sex> <Birthday>1990-11-17 14:22:33</Birthday> </row> <row> <Id>8</Id> <Name lang="cn">荀彧</Name> <Sex>1</Sex> <Birthday>2010-12-17 14:22:33</Birthday> </row> <row> <Id>7</Id> <Name lang="cn">郭女王</Name> <Sex>1</Sex> <Birthday>2020-12-17 14:22:33</Birthday> </row> </People> ``` <hr/> 1. 根节点路径表达式:`根节点元素名称 || . || /` <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req = xmlContent.evaluate('People', xmlContent, null, XPathResult.STRING_TYPE, null) console.console(req.stringValue) var req1 = xmlContent.evaluate('.', xmlContent, null, XPathResult.STRING_TYPE, null) console.console(req1.stringValue) var req2 = xmlContent.evaluate('/', xmlContent, null, XPathResult.STRING_TYPE, null) console.console(req2.stringValue) // 上面三种方式都输出: // 9 | Joy | 0 | 1990-11-17 14:22:33 // 8 | 荀彧 | 1 | 2010-12-17 14:22:33 // 7 | 郭女王 | 1 | 2020-12-17 14:22:33 ``` 2. 获取子节点表达式:以根节点开始查找下个节点形成的路径表达式 <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:| 9 | Joy | 0 | 1990-11-17 14:22:33 // ------------------------------------------------------------------------------- var req2 = xmlContent.evaluate('People/row', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2.stringValue) // 输出:9 | Joy | 0 | 1990-11-17 14:22:33 // ------------------------------------------------------------------------------- var req3 = xmlContent.evaluate('//row/Name', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req3.stringValue) // 输出:Joy ``` <p></p> > Tips:获取子节点的表达式 `People/row` 其实是获取这个相同元素的所有子节点,但 stringValue 方法只默认获取第一个匹配到的节点,使用`谓语[n]` 即可获取到指定相同节点的数据,n 是从1开始的,后面文章有介绍表达式`谓语`的相关使用示例 3. 获取节点属性值表达式:要获取到属性的值,需要使用到 `@` 符号,`@` 符号后面跟随的即使属性的名称,例如 `@lang` <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row/Name/@lang', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:en ``` <p></p> > Tips:使用路径 `//row/Name` 默认获取到第一条匹配的元素节点后,@属性则是获取对应元素上的属性值 ### 3.2. XPath 谓语 Xpath 谓词(predicates)用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中,XPath 谓语也看做是节点筛选的条件,搜索匹配到的节点信息 1. 数值筛选:直接在中括号中输入数字,如果数字超出了实际子节点的个数,则不会返回任何信息 <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row[2]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:8 | 荀彧 | 1 | 2010-12-17 14:22:33 ``` 2. 函数筛选:中括号中也可以直接放入XPath相关的函数,例如 last(),position() 等,中括号里面也是可以进行计算的,例如要查倒数第二节点,就可以使用[last()-1] <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") // 符合节点中的最后一个节点 var req1 = xmlContent.evaluate('//row[last()]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:7 | 郭女王 | 1 | 2020-12-17 14:22:33 // ------------------------------------------------------------------------------- // 符合节点中的倒数第二个节点 var req2 = xmlContent.evaluate('//row[last()-1]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2.stringValue) // 输出:8 | 荀彧 | 1 | 2010-12-17 14:22:33 // ------------------------------------------------------------------------------- // 符合节点中位置大于2的节点 var req3 = xmlContent.evaluate('//row[position() > 2]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req3.stringValue) // 输出:7 | 郭女王 | 1 | 2020-12-17 14:22:33 ``` 3. 属性筛选:中括号中还可以是节点的属性,例如包含某个属性,甚至可以是包含的属性必须等于指定的值 <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row/Name[@lang]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1) // 输出:9 | Joy | 0 | 1990-11-17 14:22:33 // ------------------------------------------------------------------------------- var req2 = xmlContent.evaluate('//row/Name[@lang="cn"]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2) // 输出:8 | 荀彧 | 1 | 2010-12-17 14:22:33 ``` > Tips:属性指定某个值时需要使用引号包裹这个值 4. 比较运算符筛选:中括号中可以是一个比较运算的表达式,可以对字符串和数字进行比较 <p></p> ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row[Sex=1]/Name', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:荀彧 // ------------------------------------------------------------------------------- var req2 = xmlContent.evaluate('//row[Id>7]/Name', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2.stringValue) // 输出:Joy // ------------------------------------------------------------------------------- var req2 = xmlContent.evaluate('//row[Name="郭女王"]/Name', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2.stringValue) // 输出:郭女王 ``` ### 3.3. XPath 通配符 XPath 路径表达式也可以使用`*`通配符,XPath 中统配符可以匹配所有节点也可以匹配节点属性 ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row/*', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:9 --通配符匹配了row节点下的所有元素节点,然后默认输出了第一个 // ------------------------------------------------------------------------------- var req2 = xmlContent.evaluate('//*', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2.stringValue) // 上面方式输出: --通配符匹配了根节点下的所有节点 // 9 | Joy | 0 | 1990-11-17 14:22:33 // 8 | 荀彧 | 1 | 2010-12-17 14:22:33 // 7 | 郭女王 | 1 | 2020-12-17 14:22:33 // ------------------------------------------------------------------------------- var req3 = xmlContent.evaluate('//row/Name[@*]', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req3.stringValue) // 输出:Joy --通配符匹配了有属性的所有节点,然后默认输出了第一个 // ------------------------------------------------------------------------------- var req4 = xmlContent.evaluate('node()', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req4.stringValue) // 上面方式输出: -- node()方法可以匹配所有节点 // 9 | Joy | 0 | 1990-11-17 14:22:33 // 8 | 荀彧 | 1 | 2010-12-17 14:22:33 // 7 | 郭女王 | 1 | 2020-12-17 14:22:33 ``` ### 3.4. XPath 同时匹配多个路径表达式 XPath 语法中允许同时匹配多个路径表达式,多个路径表达式之间使用 `|` 或符号链接 ```javascript var XmlStr = `上面XML数据源字符串` var xmlParser = new DOMParser() var xmlContent = xmlParser.parseFromString(XmlStr,"text/xml") var req1 = xmlContent.evaluate('//row/Name | //row/Id', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req1.stringValue) // 输出:9 (Id 属性在 Name 属性前面所以显示了9) // ------------------------------------------------------------------------------- var req2 = xmlContent.evaluate('//row/Name | //row/Birthday ', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req2.stringValue) // 输出:Joy (Name 属性在 Birthday 属性前面所以显示了Name) // ------------------------------------------------------------------------------- var req3 = xmlContent.evaluate('//row/Name[@lang="cn"] | //row/Name', xmlContent, null, XPathResult.STRING_TYPE, null) console.log(req3.stringValue) // 输出:Joy (满足 Name 属性在 Name[@lang="cn"] 属性前面所以显示了Name) ``` [========] > **Tips:**本文示例中使用的 DOMParser 对象中的 xmlContent.evaluate 方法,输出节点信息有些不全,实际开发使用这种方式时需注意,测试不可漏,还有本文中示例当前节点都是根节点 ## 参考资料 >[《XPath 教程》](https://www.runoob.com/xpath/xpath-nodes.html) [《W3C XPath 介绍》](https://www.w3.org/TR/xpath-30/) [《XPath》](https://developer.mozilla.org/zh-CN/docs/Web/XPath)
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号