gh_mirrors/xpath/xpath支持的XPath函数全清单:从基础到高级
【免费下载链接】xpathXPath package for golang, supports HTML, XML, JSON document query and more项目地址: https://gitcode.com/gh_mirrors/xpath/xpath
如果你正在寻找一个功能强大的Go语言XPath包来查询XML、HTML和JSON文档,那么gh_mirrors/xpath/xpath项目绝对是你的不二之选!🎯 这个项目提供了完整的XPath 1.0支持,并包含了许多XPath 2.0的函数,让你能够轻松处理各种文档查询需求。本文将为你详细介绍该项目支持的所有XPath函数,从基础到高级,帮助你快速掌握这个强大的工具。
📋 项目简介
gh_mirrors/xpath/xpath是一个Go语言的XPath包,支持从XML、HTML和JSON文档中选择节点。该项目是antchfx/xpath的镜像仓库,提供了稳定可靠的XPath实现。通过这个包,你可以轻松地对文档进行复杂的查询和筛选操作。
🎯 核心XPath函数分类
1. 节点集函数(Node-Set Functions)
节点集函数主要用于处理节点集合,帮助你获取节点信息或统计节点数量。
position()- 获取节点位置
返回当前节点在节点集中的位置(从1开始计数)。
//book[position() = 1] // 选择第一个book元素 //li[position() mod 2 = 0] // 选择偶数位置的li元素last()- 获取最后一个节点
返回节点集中最后一个节点的位置。
//book[last()] // 选择最后一个book元素 //ul/li[last()] // 选择ul中最后一个li元素count()- 统计节点数量
返回节点集中的节点数量。
count(//book) // 统计所有book元素的数量 count(//book[3]/author) // 统计第三个book元素的author子元素数量name()- 获取节点名称
返回节点的完整名称(包括命名空间前缀)。
name(//html/@lang) // 返回"lang" name(html/head/title) // 返回"title"local-name()- 获取本地名称
返回节点的本地名称(不包含命名空间前缀)。
local-name(bookstore) // 返回"bookstore" local-name(//mybook:book) // 返回"book"namespace-uri()- 获取命名空间URI
返回节点的命名空间URI。
2. 字符串函数(String Functions)
字符串函数用于处理和操作文本内容,是XPath中最常用的函数类别之一。
string()- 转换为字符串
将任意类型的值转换为字符串。
string(1.23) // 返回"1.23" string(//book/@category) // 返回属性值concat()- 连接字符串
将多个字符串连接成一个字符串。
concat("1", "2", "3") // 返回"123" concat(//book[1]/title, ", ", //book[1]/year) // 返回"Everyday Italian, 2005"contains()- 检查包含关系
检查第一个字符串是否包含第二个字符串。
contains("tattoo", "t") // 返回true contains("tattoo", "T") // 返回false //book[contains(title, "Potter")] // 选择标题包含"Potter"的book元素starts-with()- 检查前缀
检查字符串是否以指定前缀开头。
starts-with("tattoo", "tat") // 返回true starts-with("tattoo", "att") // 返回false //book[starts-with(title,'Everyday')] // 选择标题以"Everyday"开头的book元素ends-with()- 检查后缀
检查字符串是否以指定后缀结尾。
ends-with("tattoo", "tattoo") // 返回true ends-with("tattoo", "atto") // 返回false //book[ends-with(@category,'ing')] // 选择category属性以"ing"结尾的book元素substring()- 获取子字符串
从字符串中提取子字符串。
substring("motor car", 6) // 返回" car" substring("metadata", 4, 3) // 返回"ada" substring("12345", 1.5, 2.6) // 返回"234"substring-before()- 获取前缀子串
返回第一个字符串中出现在第二个字符串之前的部分。
substring-before("tattoo", "attoo") // 返回"t"substring-after()- 获取后缀子串
返回第一个字符串中出现在第二个字符串之后的部分。
substring-after("tattoo", "tat") // 返回"too"string-length()- 获取字符串长度
返回字符串的长度。
string-length("Harp not on that string, madam; that is past.") // 返回45 string-length(normalize-space(' abc ')) // 返回3normalize-space()- 规范化空格
移除字符串开头和结尾的空格,并将中间的连续空格替换为单个空格。
normalize-space(' Hello World ') // 返回"Hello World"translate()- 字符替换
将字符串中的字符替换为其他字符。
translate("bar","abc","ABC") // 返回"BAr" translate("--aaa--","abc-","ABC") // 返回"AAA" translate("abcdabc", "abc", "AB") // 返回"ABdAB"matches()- 正则表达式匹配
使用正则表达式检查字符串是否匹配模式。
matches("abracadabra", "bra") // 返回true matches("abracadabra", "(?i)^A.*A$") // 返回true(不区分大小写) matches("abracadabra", "^a.*a$") // 返回true3. 数值函数(Numeric Functions)
数值函数用于处理数字计算和转换。
number()- 转换为数字
将值转换为数字。
number(10) // 返回10 number(1.11) // 返回1.11 number("10") = 10 // 返回truesum()- 求和
计算节点集中所有数值的总和。
sum(1 + 2) // 返回3 sum(1.1 + 2) // 返回3.1 sum(//book/price) // 计算所有book的price总和ceiling()- 向上取整
返回不小于参数的最小整数。
ceiling(5.2) // 返回6 ceiling(4.8) // 返回5floor()- 向下取整
返回不大于参数的最大整数。
floor(5.2) // 返回5 floor(4.8) // 返回4round()- 四舍五入
返回最接近参数的整数。
round(5.2) // 返回5 round(5.6) // 返回6 round(5.5) // 返回64. 布尔函数(Boolean Functions)
布尔函数用于逻辑判断和布尔值处理。
boolean()- 转换为布尔值
将值转换为布尔值。
boolean(0) // 返回false boolean(1) // 返回true boolean(//*[@lang]) // 如果存在lang属性则返回truenot()- 逻辑非
返回参数的逻辑非。
not(0) // 返回true not(1) // 返回false //employee[not(@id = "1")] // 选择id不等于1的employee元素true()- 返回真值
始终返回true。
true() // 返回truefalse()- 返回假值
始终返回false。
false() // 返回false5. XPath 2.0扩展函数
虽然项目主要支持XPath 1.0,但也包含了一些XPath 2.0的函数。
lower-case()- 转换为小写
将字符串转换为小写(XPath 2.0函数)。
string-join()- 连接字符串序列
使用分隔符连接字符串序列(XPath 2.0函数)。
string-join("some text", ";") // 返回"some text" string-join(//book/@category, ";") // 返回"cooking;children;web;web"reverse()- 反转序列
反转节点序列的顺序(XPath 2.0函数)。
6. 不支持的函数
根据项目文档,以下XPath函数目前不支持:
choose()- 条件选择current()- 当前节点上下文document()- 加载外部文档element-available()- 检查元素可用性format-number()- 格式化数字function-available()- 检查函数可用性generate-id()- 生成唯一IDid()- 根据ID选择元素key()- 使用键值选择lang()- 检查语言system-property()- 获取系统属性unparsed-entity-url()- 获取未解析实体URL
🚀 实际应用示例
示例1:图书目录查询
假设我们有一个图书目录的XML文档,可以使用以下XPath查询:
// 选择2005年出版的所有图书 //book[year = 2005] // 选择价格超过40元的图书 //book[sum(./price) > 40] // 选择分类为"cooking"的图书 //book[@category = 'cooking'] // 选择标题包含"Potter"的图书 //book[contains(title, "Potter")]示例2:HTML文档处理
对于HTML文档,XPath函数同样适用:
// 选择所有链接 //a[@href] // 选择包含特定文本的元素 //*[contains(text(), "搜索")] // 选择特定class的元素 //div[contains(@class, "container")] // 获取页面标题 string(//title)示例3:JSON文档查询
虽然JSON文档的结构不同,但XPath查询原理相似:
// 选择所有用户 //users // 选择年龄大于18的用户 //users[age > 18] // 选择特定城市的用户 //users[city = '北京']📊 函数速查表
| 函数类别 | 函数名 | 描述 | 支持状态 |
|---|---|---|---|
| 节点集 | position() | 获取节点位置 | ✅ |
| 节点集 | last() | 获取最后一个节点 | ✅ |
| 节点集 | count() | 统计节点数量 | ✅ |
| 节点集 | name() | 获取节点名称 | ✅ |
| 节点集 | local-name() | 获取本地名称 | ✅ |
| 节点集 | namespace-uri() | 获取命名空间URI | ✅ |
| 字符串 | string() | 转换为字符串 | ✅ |
| 字符串 | concat() | 连接字符串 | ✅ |
| 字符串 | contains() | 检查包含关系 | ✅ |
| 字符串 | starts-with() | 检查前缀 | ✅ |
| 字符串 | ends-with() | 检查后缀 | ✅ |
| 字符串 | substring() | 获取子字符串 | ✅ |
| 字符串 | substring-before() | 获取前缀子串 | ✅ |
| 字符串 | substring-after() | 获取后缀子串 | ✅ |
| 字符串 | string-length() | 获取字符串长度 | ✅ |
| 字符串 | normalize-space() | 规范化空格 | ✅ |
| 字符串 | translate() | 字符替换 | ✅ |
| 字符串 | matches() | 正则表达式匹配 | ✅ |
| 数值 | number() | 转换为数字 | ✅ |
| 数值 | sum() | 求和 | ✅ |
| 数值 | ceiling() | 向上取整 | ✅ |
| 数值 | floor() | 向下取整 | ✅ |
| 数值 | round() | 四舍五入 | ✅ |
| 布尔 | boolean() | 转换为布尔值 | ✅ |
| 布尔 | not() | 逻辑非 | ✅ |
| 布尔 | true() | 返回真值 | ✅ |
| 布尔 | false() | 返回假值 | ✅ |
| XPath 2.0 | lower-case() | 转换为小写 | ✅ |
| XPath 2.0 | string-join() | 连接字符串序列 | ✅ |
| XPath 2.0 | reverse() | 反转序列 | ✅ |
💡 使用技巧与最佳实践
1. 性能优化建议
- 尽量使用具体的路径表达式,避免使用
//全局搜索 - 在可能的情况下使用属性选择器,它们通常比文本选择器更快
- 缓存编译后的XPath表达式,避免重复编译
2. 错误处理
- 使用
MustCompile函数时要注意错误处理 - 对于复杂的XPath表达式,建议先测试再使用
- 注意数据类型转换可能导致的错误
3. 兼容性考虑
- 该项目支持Go 1.14及以上版本
- 主要遵循XPath 1.0标准,部分支持XPath 2.0
- 与W3C XPath标准高度兼容
🔧 项目结构与源码
项目的核心XPath函数实现在以下文件中:
- func.go - 包含所有XPath函数的实现
- func_pre_go110.go - Go 1.10之前的兼容实现
- func_go110.go - Go 1.10及之后的优化实现
- xpath_function_test.go - XPath函数的测试用例
🎉 总结
gh_mirrors/xpath/xpath项目提供了完整且强大的XPath函数支持,涵盖了XPath 1.0的大部分功能以及部分XPath 2.0功能。无论你是需要处理XML、HTML还是JSON文档,这个项目都能提供高效的查询能力。
通过本文的介绍,你应该已经掌握了:
- ✅ 所有支持的XPath函数及其用法
- ✅ 函数的分类和实际应用示例
- ✅ 性能优化和使用技巧
- ✅ 项目结构和源码位置
现在你可以开始使用这个强大的XPath包来处理你的文档查询需求了!无论是简单的元素选择还是复杂的条件筛选,gh_mirrors/xpath/xpath都能帮助你轻松完成。🚀
记住,实践是最好的学习方式。尝试在自己的项目中使用这些XPath函数,你会发现文档处理变得如此简单高效!
【免费下载链接】xpathXPath package for golang, supports HTML, XML, JSON document query and more项目地址: https://gitcode.com/gh_mirrors/xpath/xpath
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考