神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情”
前言
- XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历
- XPath 除了 xml 以外,还可以用在 css 中选择器。
素材准备
xml
```
- 学校里每个老师负责1个甚至多个班级管理,换言之老师与学生1对N关系,基于这个场景构建了上述的xml文件,下面我们通过XPATH来进行联系定位吧。
python
- 既然是操作肯定不能放几个命令完事,我们采用python下的ElementTree进行xml操作。下面这段代码就是读取写入xml文件。另外在python中针对节点选择已经建议通过 ./ .// 代替 / // 等情况。为了演示效果后面都会采用点开头。
import xml.etree.ElementTree as ET
with open('tea.xml', 'tr', encoding='utf-8') as rf:
tree = ET.parse(rf)
tree.write('pom.xml',encoding='UTF-8',xml_declaration='true')
读取节点
| 表达式 | 描述 | | -------- | ----------------------------- | | nodename | 选取此节点的所有子节点。 | | / | 从根节点选取。 | | // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 | | . | 选取当前节点。 | | .. | 选取当前节点的父节点。 | | @ | 选取属性。 |
- 基本上我们对于节点的定位莫过于【选择所有】【从指定地方开始选择】【选择相对节点】【选择节点属性】【选择节点文本】
查看学生列表
import xml.etree.ElementTree as ET
with open('tea.xml', 'tr', encoding='utf-8') as rf:
tree = ET.parse(rf)
for node in tree.findall('student'):
print(node.tag)
tree.write('pom.xml',encoding='UTF-8',xml_declaration='true')
- 对应XPATH中直接选择器,我们解析下来的tree对象就是teacher包裹的内容,teacher的直接属性就是student , 值得注意的是这里的选择是区分层级关系的,如果你想获取student下的age属性需要
tree.findall(student/age)
才可以而且这样我们只能获取到student下的两个age节点。
从根出发
- 我们将视角下移到
colleague
节点视角。这时候再去查找当前节点以外的数据就会找不到。
- 我们通过
./
的方式指明了我们选取的开始位置是从跟节点开始的。
从根出发2
- 有的时候层级特别多的时候,如果再一层一层的找下去将会很耗时,好在XPATH提供了一种快捷操作。我只想查考teacher下面所有具有age标签节点的age 信息。
爸爸去哪了
- 相对路径查找父级还是很常见的。经过测试我只能遗憾的说python并没有通过
..
进行查找。
查找年龄28岁的学生姓名
- 我想找到某个元素但是他没有啥特点,但是他的兄弟节点很有特色,这个时候我们如果一层一层定位跳转显得有些麻烦。
敏感词检测
- 有的时候我们需要检测下特定内容是否出现,我们可以通过
[.='text']
进行匹配,只要子节点包括后代出现了该文本就会检测出来。这部分章节属于Python
的ElementTree
的范畴了,这里不演示了知道就行。
定位指定属性
- 兴趣广泛的你想要在学号=2的学生。
- 我想查看拥有别名的学生有哪些。
- 甚至我们还可以为属性做一些判断 , 比如官网这段代码。
/bookstore/book[price>35.00]/title
总结
- XPATH方便了我们在XML中的灵活定位跳转,有了它我们操作XML也就方便了很多,本章主要介绍的XPATH, 所以关于xml的操作就没有过多的谈及到,想要了解更多主页搜索XML。
「其他文章」
- 避免回表,引入索引下推|提高索引命中率 | 提前下班啦
- TDengine 时序性数据库为什么海量数据下不卡顿呢
- 神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
- springboot通用分支处理---还在硬编码特殊处理逻辑?超级管理员不应该被区别对待
- Spring事务太强大了,兼容数据库同时给我们提供多种组合应对业务需求
- java对象在内存中如何分布 | java上锁原来就是内存占位,so easy
- linux三剑客之编辑器sed出厂
- linux三剑客awk教你如何裁剪结果集
- 线程池7个参数拿捏死死的,完爆面试官
- 线程池存在的意义
- 多年程序员总结下来的懒人必备脚本之进度条⚠️制作
- java中的static关键字说清楚还得靠JVM
- 设计模式存在哪些关联关系,六种关系傻傻分不清--- UML图示详解
- 每次需求评审产品总是让我提高代码复用,说白了就是合成复用原则
- 越级上报不可行,各司其职才是王道---迪米特法则
- 偏向锁/轻量锁/重级锁锁锁更健康,上锁解锁到底是怎么完成实现的,我来告诉你
- 狸猫换太子里氏替换原则;不要一味的进行抽象否则最后你无法hold你的对象
- 设计模式是我摆脱码畜的唯一出路---依赖倒转原则
- 学好数理化,写遍所有代码都不怕,我用数学分类讨论的思想解决
- synchronized已经不在臃肿了,放下对他的成见之初识轻量级锁