一、簡介
本文章以如下xml 樣例進行講解命名空間和xpath
xml_text="""<?xml version="1.0"?><actors xmlns:fictional="http://characters.example.com"xmlns="http://people.example.com"><actor><name>John Cleese</name><fictional:character>Lancelot</fictional:character><fictional:character>Archie Leach</fictional:character></actor><actor><name>Eric Idle</name><fictional:character>Sir Robin</fictional:character><fictional:character>Gunther</fictional:character><fictional:character>Commander Clement</fictional:character></actor></actors>"""
二、xml命名空間和find命令
xml中可以沒有默認命名空間,但是如果要有,只能有一個默認命名空間;當一個xml使用了命名空間語法,則find/findall方法必須使用帶有命名空間的調用方式否則無法查詢數據。實例如下:
root = ET.fromstring(xml_text)
for actor in root.findall('actor'): # 結果為空name = actor.find('{http://people.example.com}name')print(name.text)for char in actor.findall('{http://characters.example.com}character'):print(' |-->', char.text)
find(match, namespaces=None)
findall(match, namespaces=None)
其中的namespaces是一個dict類型或者一個空字符串,使用方式如下:
ns1={'role1':'url1'}
find('role1:tag1',ns1) #查詢命名空間在url1的tag1
實例如下:
ns = {'real_person': 'http://people.example.com','role': 'http://characters.example.com'}for actor in root.findall('real_person:actor', ns):name = actor.find('real_person:name', ns)print(name.text)for char in actor.findall('role:character', ns):print(' |-->', char.text)
或者
find('{url1}tag1') #查詢命名空間在url1的tag1
實例如下:
root = fromstring(xml_text)
for actor in root.findall('{http://people.example.com}actor'):name = actor.find('{http://people.example.com}name')print(name.text)for char in actor.findall('{http://characters.example.com}character'):print(' |-->', char.text)
三、xpath詳解
語法 | 示例 | 說明 |
---|---|---|
tag | find(“tag1”) | 查詢標簽為tag1的第一層子元素;spam/tag1 查詢標簽為spam的第一層子元素下的tag1標簽 |
// | find(“.//a”) | 其中.是必須的,否則會報錯;該語句會返回當前元素下的所有級別上的a標簽,(不包含當前元素) |
* | find(“*”) | 查詢當前級別下的所有子元素,*/egg 查詢當前層級下grandchild elements為egg的元素 |
[position] | 位置是指當前層級下第一層子元素的位置,0代表第一個,1代表第二個,依此類推,-1代表倒數第二個 |
注意: 謂詞(方括號內的表達式)前面必須有標記名稱、星號或其他謂詞。position 謂詞前面必須有一個標記名稱。
2、實踐
find(*)
xml_text1="<a name1='a1'><a name2='a2'><a name3='a3'></a></a><a name2_1='a2_1'><a name3_1='a3_1'></a></a></a>"
root1 = ET.fromstring(xml_text1)
for a in root1.findall('*'):print(a.attrib)PS C:\Users\love1\Documents\technology\python\project\test1> python .\test-xml.py
{'name2': 'a2'}
{'name2_1': 'a2_1'}
child elements 第一層子元素
grandchild elements 第二層子元素
subelements 所有子元素
on all levels beneath the current element 在當前元素下的所有級別上
引用
python xml xpath