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

語言: CN / TW / HK

“我報名參加金石計劃1期挑戰——瓜分10萬獎池,這是我的第4篇文章,點擊查看活動詳情

前言

  • XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷
  • XPath 除了 xml 以外,還可以用在 css 中選擇器。

素材準備

xml

```

 zxhtom  29  JemiL  28 zhangsan  99 ```

  • 學校裏每個老師負責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選擇