目錄:
xml 介紹elementtree 基礎講解2.1 節點屬性2.2 節點搜尋獲取矩形框的座標和類別參考
我需要對目標檢測標註工具 labelimg 得到的xml檔案進行解析,得到其中矩形框對應的類別和座標值,所以對python下面的elementtree
研究了一下。
xml全稱為可擴充套件標記語言(extensible markup language),在很多應用程式中xml編碼格式的資料被用來在系統之間構建、儲存和傳輸資料。現在用來與服務端互動的主要是json和xml格式的資料,常用於網頁資料抓取和解析結構化文件。
本文使用python內建的elementtree
包來解析xml檔案,從而提取出有用的資料。
elementtree
將整個xml檔案放到記憶體中,將xml資料在記憶體中解析成乙個樹結構,通過樹來操作xml,可以任意遍歷樹的節點,樹中的每個節點都是乙個物件。
xml 是一種分級的樹狀資料形式,它被表示為一棵樹,et 有兩個物件來實現這個目的:
elementtree 將整個 xml 檔案解析為一棵樹;
element 將單個結點及其子節點解析為樹。
我用這個 xml 檔案做例子進行講解:
item1abc
item2abc
human
import xml.etree.elementtree as et
# 載入xml檔案
tree = et.parse('10.xml')
# tree = et.elementtree(file='10.xml')#
# 獲得root element節點
root = tree.getroot()
et.parse
和et.elementtree
都可以載入xml檔案,好像沒什麼區別,前者用得比較多。
getroot()
得到xml樹的根節點,一旦我們能夠訪問根節點,我們就可以很容易地遍歷樹中的所有子結點(element),因為樹是乙個連通圖。
還可以獲得節點的一些屬性,乙個節點通常為:
text tail
比如下面這個例子:
hello123
檢視根節點的屬性:
print("tag: {}, attrib: {}".format(root.tag, root.attrib))
# 輸出:
# tag: data, attrib:
print(len(root[0])) # 連線根節點的子節點數
for elem in root:
print(elem.tag, elem.attrib, elem.text)
# 輸出:
# 2# items {}
# object {} human
兩個子節點的attrib
都為空字典,且因為items
下面還有子節點,所以items.text
為空。
也可以通過索引選擇子結點:
print(root[0][0].tag, root[0][0].attrib, root[0][0].text)
# 輸出
# ('item', , 'item1abc')
可以通過遞迴獲取 xml 中的所有節點,elementtree
物件和element
物件有乙個iter
方法可以建立乙個樹迭代器,以對所有結點進行深度優先遍歷。
# 遍歷xml檔案中的所有節點
for elem in tree.iter():
print(elem.tag, elem.attrib)
# 輸出:
# data
# items {}
# item
# item
# object {}
iter()
方法也可以接收乙個tag,表示只遍歷指定名字的節點:
for elem in tree.iter(tag='item'):
print(elem, elem.tag, elem.text)
# 輸出:
# item item1abc
# item item2abc
當xml檔案較大或者其中的子節點 tag 非常多的時候,乙個乙個獲取比較麻煩而且有很多不是需要的,可以通過find()
或者findall()
方法來查詢指定 tag 的節點。
for elem in root:
print(elem.find('item'))
print(elem.findtext('item'))
# 輸出:
# # item1abc
# none
# none
上面是找到節點中第乙個名為item
的子節點和其文字內容,因為object
節點沒有名為item
的子節點,所以返回 none。
下面程式為找到當前節點下名為item
的所有子節點:
for elem in root:
for subelem in elem.findall('item'):
print(subelem.attrib)
print(subelem.get('name'))
# 輸出:
# # item1
# # item2
上面是只通過 tag(節點名)來查詢節點,也可以通過節點的路徑來找到所有節點:
for elem in root.findall('./items/item'): # path
print(elem.attrib)
# 輸出:
# #
我用從 imglabel 工具得到的乙個xml檔案作為例子:
這個檔案主要有如下內容:
(folder)資料夾名稱
(filename)名
(path)檔案路徑
(size)寬高及深度
(object->name)目標的類別名稱
(object->bndbox)邊框座標
我們主要是想獲得的是object
節點下的name
和bndbox
,它們分別對應矩形框的目標類別和座標值。
程式如下:
import xml.etree.elementtree as et
tree = et.elementtree(file="10.xml")
root = tree.getroot()
boxes =
for elem in root.iter(tag='object'):
# 獲取矩形框座標
box = [int(el.text) for el in elem.find('bndbox')]
# 獲取目標類別
print(boxes)
# 輸出:
# [[139, 152, 221, 257, 'dog'], [55, 46, 122, 113, 'cat']]
上面涉及到的知識點前面都有講解,就不多說了,最後輸出結果為乙個列表,列表中的每個元素為乙個矩形框的座標值和類別。
xml.etree.elementtree api
reading and writing xml files in python
python xml with elementtree: beginner's guide
working with xml files in python
XML XML解析介紹
解析思想 解析 讀取xml.將xml中記錄 的資料提取.dom document object model 文件物件模型 dom思想是由w3c組織 world wide web 發布的.核心思想 把文件中所有內容都 封裝成物件.物件種類 document 整個 html,xml 文件 element...
XML(XML概述 XML約束 XML解析)
1 xml 可擴充套件的標記語言。2 xml的作用 3 xml語法 注釋 元素 element 標籤 tag 格式化良好的xml文件,必須只有乙個根元素 屬性 attribute 轉義字元 cdata區 1 xml約束 2 根據dtd約束寫xml文件 3 三種dtd約束 4 schema約束 1 x...
解析xml檔案(DOM解析)
解析的檔案 醫院心電圖記錄單 門診號 1002080066 住院號 201800964 姓名 羅2 性別 女 年齡 26歲 心檢號 科室 婦產科 床號 9 複查時註明原心檢號 韻律 竇律 心房率 82 心室率 82 軸向 電軸正常 pr間期 0.13 qrs波 0.08 qt間期 0.34 正常心電...