神奇的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已經不在臃腫了,放下對他的成見之初識輕量級鎖