etree解析xml XML 檔案解析

2021-10-14 14:24:49 字數 4407 閱讀 5741

目錄:

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.parseet.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節點下的namebndbox,它們分別對應矩形框的目標類別和座標值。

程式如下:

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 正常心電...