神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路

3,481 阅读3分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情

前言

  • XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历
  • XPath 除了 xml 以外,还可以用在 css 中选择器。

素材准备

xml

<?xml version="1.0" encoding="UTF-8"?>
<teacher>
<student no="1">
  <name alias="wq">zxhtom</name>
  <age>29</age>
</student>
<student no="2">
  <name alias="qiao">JemiL</name>
  <age>28</age>
</student>
<colleague>
    <name>zhangsan</name>
  <age>99</age>
</colleague>
</teacher>
  • 学校里每个老师负责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节点。

image-20220830103450648.png

从根出发

  • 我们将视角下移到 colleague 节点视角。这时候再去查找当前节点以外的数据就会找不到。

image-20220830103852192.png

  • 我们通过 ./ 的方式指明了我们选取的开始位置是从跟节点开始的。

image-20220830104943231.png

从根出发2

  • 有的时候层级特别多的时候,如果再一层一层的找下去将会很耗时,好在XPATH提供了一种快捷操作。我只想查考teacher下面所有具有age标签节点的age 信息。

image-20220830105335033.png

爸爸去哪了

  • 相对路径查找父级还是很常见的。经过测试我只能遗憾的说python并没有通过 .. 进行查找。

image-20220830110843445.png

查找年龄28岁的学生姓名

  • 我想找到某个元素但是他没有啥特点,但是他的兄弟节点很有特色,这个时候我们如果一层一层定位跳转显得有些麻烦。

image-20220830111455483.png

敏感词检测

  • 有的时候我们需要检测下特定内容是否出现,我们可以通过 [.='text'] 进行匹配,只要子节点包括后代出现了该文本就会检测出来。这部分章节属于 PythonElementTree 的范畴了,这里不演示了知道就行。

定位指定属性

  • 兴趣广泛的你想要在学号=2的学生。

image-20220830113225611.png

  • 我想查看拥有别名的学生有哪些。

image-20220830113805661.png

  • 甚至我们还可以为属性做一些判断 , 比如官网这段代码。
/bookstore/book[price>35.00]/title

总结

  • XPATH方便了我们在XML中的灵活定位跳转,有了它我们操作XML也就方便了很多,本章主要介绍的XPATH, 所以关于xml的操作就没有过多的谈及到,想要了解更多主页搜索XML。

XPATH文档

Python关于XML的xpath选择