Python 第三方模塊之 ElementTree(ET)- 解析XML文件

ElementTree是Python常用的處理XML文件的類。下面將介紹使用ElementTree解析、查找、修改XML的方法。

1、引用方法

import xml.etree.ElementTree as ET

2、一個XML例子

下面所有的操作都將下面這段XML為例,我們將它保存為sample.xml。

<?xml version="1.0"?>
<data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc><neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year><gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> 
</data>

先對XML的格式做一些說明:
? ? Tag: 標簽,如country標簽
? ? Element:被Tag包圍的部分,值,如 68,2011 等
? ? Attribute:標簽的屬性,如country標簽的name

3、解析XML

3.1 讀取

讀入XML數據有三種途徑,從文件讀入和從字符串讀入,文件讀入有2種

1、python3.3之后ElementTree模塊會自動尋找可用的C庫來加快速度

import xml.etree.ElementTree as ETtree = ET.parse('sample.xml')
root = tree.getroot()

2、調用ElementTree類ElementTree(self, element=None, file=None) # 這里的element作為根節點

import xml.etree.ElementTree as ETtree = ET.ElementTree(file="country.xml")
root = tree.getroot()  # <Element 'data' at 0x030EA600>

3、從字符串讀入:

import xml.etree.ElementTree as ETdata = open("country.xml").read()
root = ET.fromstring(data)
# root = ET.fromstring(sample_as_string)

3.2 查看Tag和Attribute

# 當要獲取屬性值時,用attrib方法。 返回一個字典,如
print(root.attrib)
# 可以Element.get(AttributeName)來代替Element.attrib[AttributeName]來訪問。# 當要獲取節點值時,用text方法。返回一個字符串,如
print(root.text)# 當要獲取節點名時,用tag方法。 返回一個字符串,如
print(root.tag)

3.3 查看孩子

.root.attrib返回的是一個空字典,如果看root的孩子,可以得到非空的attrib字典。

1、使用for...in...查詢根節點下二級節點的所有元素

print(root.tag)# 根節點標簽
for child in root:print(child.tag,child.attrib)  # 二級節點標簽、屬性、內容,結果得到
# country {'name': 'Liechtenstein'}
# country {'name': 'Singapore'}
# country {'name': 'Panama'}

2、使用findall等查詢根節點下的元素

Element.iter()用來尋找所有符合要求的Tag,注意,這里查找的范圍是所有孩子和孩子的孩子 and so
Element.findall()只查找直接的孩子,返回所有符合要求的Tag的Element
Element.find()只返回符合要求的第一個Element。如果查看Singapore的year的值

for child in root.findall('.//country'):print(child.tag,child.attrib)

4、修改XML

前面已經介紹了如何獲取一個Element的對象,以及查看它的Tag、Attribute、值和它的孩子。下面介紹如何修改一個Element并對XML文件進行保存

修改Element。修改Element可以直接訪問Element.text。

import xml.etree.ElementTree as ET# 修改Element的Attribute,也可以用來新增Attribute:
ET.Element.set('AttributeName','AttributeValue')# 新增孩子節點:
root.append(childElement)# 刪除孩子節點:
root.remove(childElement)

保存XML。我們從文件解析的時候,我們用了一個ElementTree的對象tree,在完成修改之后,還用tree來保存XML文件。

tree.write('output.xml')

構建XML。ElementTree提供了兩個靜態函數(直接用類名訪問,這里我們用的是ET)可以很方便的構建一個XML,如:

import xml.etree.ElementTree as ETroot = ET.Element('data')
country = ET.SubElement(root,'country', {'name':'Liechtenstein'})  # root 增加 country 節點
rank = ET.SubElement(country,'rank')  # country 增加 rank 節點
rank.text = '1'
year = ET.SubElement(country,'year')  # country 增加 year節點
year.text = '2008'
ET.dump(root)

5、XPath支持

XPath表達式用來在XML中定位Element,下面給一個例子來說明:

import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)# Top-level elements
root.findall(".")
# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")
# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@name='Singapore']")
# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@name='Singapore']/year")
# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")

6、namespace?

6.1 namespace 獲取

# namespace 為 正則匹配獲取,可能不同版本的會獲取不到
root = tree.getroot()
namespace = re.search('\{.*?\}', root.tag)[0]

6.2?xml.etree.Element 在處理含有namespace的xml文件時寫入會產生ns0

root = tree.getroot()
namespace = re.search('\{.*?\}', root.tag)[0]
ET.register_namespace('', namespace.strip('{}'))  # 部分人說這步需要在parse之前做,在我的版本上不需要

7、其他錯誤

7.1?Error parsing XML: junk after document element

一般合法的XML文件只有一個主根節點,比如

<android123><item1/><item2/><item3/>
</android123>

如果出現了Error parsing XML: junk after document element這樣的錯誤,你的想法可能只要主根有多個節點,比如說

<android123><item1/>
</android123>
<android123><item2/><item3/>
</android123>

xml不能解析,原因有可能為xml格式寫的不對,考慮根節點不對。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454585.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 編譯luajit,Android 嵌入 LuaJIT 的曲折道路

相關鏈接&#xff1a;Windows 下編譯 LuaJIT懶人與伸手黨可以直接看最底部。為什么使用 LuaJITLua 官方版的編譯嵌入相對簡單&#xff0c;但是為什么要用 LuaJIT 呢&#xff1f;我所了解到的優勢有&#xff1a;更高的運行效率。支持運行 Lua 編譯后的機器碼。雖然 Lua 也支持編…

運維自動化之使用PHP+MYSQL+SHELL打造私有監控系統(一)

前言 記得剛來這家公司的時候&#xff0c;我部門就我一個運維工程師&#xff0c;然后就是經理&#xff0c;剛開始公司平臺什么監控都沒有&#xff0c;在我與經理的努力下&#xff0c;先搭建nagioscacti監控平臺&#xff0c;后來隨著公司業務的增加&#xff0c;平臺的功能與服務…

面試風云錄(01) - 怎樣回答這兩個問題?

由于工作經歷的緣故&#xff0c;使我有一些面試別人的機會&#xff0c;所以應該還有一些經驗可以跟大家聊聊。 當我們提到“面試” 這個詞&#xff0c;總是讓人有種階級感&#xff0c;好像面試官就是高高在上&#xff0c;而面試者則是屈居于下&#xff0c;其實并非如此&#xf…

Redis Python

Python操作Redis 安裝Python使用Redis的庫 sudo pip install redis or sudo easy_install redis or 源碼安裝 詳見&#xff1a;https://github.com/WoLpH/redis-py 1.1 操作模式 redis-py提供兩個類Redis和StrictRedis用于實現Redis的命令&#xff0c;StrictRedis用于實現大…

android 代碼寫命令,monkey基本命令及腳本編寫(示例代碼)

Monkey 是Android自帶的黑盒測試工具&#xff0c;一般通過隨機觸發界面事件&#xff0c;來確定應用是否會發生異常&#xff0c;多用于android應用的穩定性、壓力測試基本命令&#xff1a;adb shell monkey [options] usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] .…

js更新數組對象_7 種Vue 數據已更新而頁面沒有更新的情況及深化總結(收藏)

作者&#xff1a;前端1943鏈接&#xff1a;https://segmentfault.com/a/1190000022772025如果你發現你自己需要在 Vue 中做一次強制更新&#xff0c;99.9% 的情況&#xff0c;是你在某個地方做錯了事。1. Vue 無法檢測實例被創建時不存在于 data 中的 property原因&#xff1a;…

從P560小型機B181201B故障代碼識別手把手詳解

背景&#xff1a;生產小型機發生宕機事件&#xff0c;現場發現液晶面板存在B181201B代碼&#xff0c;可是查看網絡&#xff0c;未見有權威的參考文章&#xff0c;通過管理口登錄HMC管理界面&#xff0c;發現錯誤代碼B181201B&#xff0c;同時提示可能是電源故障&#xff0c;后登…

Java反射中method.isBridge() 橋接方法

橋接方法是 JDK 1.5 引入泛型后&#xff0c;為了使Java的泛型方法生成的字節碼和 1.5 版本前的字節碼相兼容&#xff0c;由編譯器自動生成的方法。我們可以通過Method.isBridge()方法來判斷一個方法是否是橋接方法。 假定接口 public interface SuperClass<T> {void met…

python 利用pexpect進行多機遠程命令執行

在安裝之前&#xff0c;確認你的機器安裝了python,和easy_install.通常python是自動安裝的&#xff0c;如果沒有安裝easy_install&#xff0c;那么wget -q http://peak.telecommunity.com/dist/ez_setup.py 獲取一下python ez_setup.pypexpect是python一個模塊&#xff0c;可以…

Python 之 線程

進程 之前我們已經了解了操作系統中進程的概念&#xff0c;程序并不能單獨運行&#xff0c;只有將程序裝載到內存中&#xff0c;系統為它分配資源才能運行&#xff0c;而這種執行的程序就稱之為進程。程序和進程的區別就在于&#xff1a;程序是指令的集合&#xff0c;它是進程…

flymcu無法打開串口_西門子1200與其他PLC/組態軟件無線串口通訊(自由口)

一、控制系統原理圖1:控制系統原理二、硬件需求S7-1200 PLC目前有3種類型的CPU&#xff1a;1)S7-1211C CPU2)S7-1212C CPU3)S7-1214C CPU這三種類型的CPU都可以連接三個串口通信模版本例中使用的PLC硬件為&#xff1a;1)PM1207電源(6EP1 332-1SH71)2)S7-1214C(6ES7 214-1BE30-0…

android按鈕固定尺寸,如何在android中保持按鈕的固定寬高比

我正在改進你的XML.我沒有測試它,但它應該工作.建議的更改是,而不是將圖像設置為背景,將其設置為ImageButtons的src.此外,如果您堅持使用Button,則可以使用其他布局包裝每個按鈕,并將其重力屬性設置為“center”.看一下下面的XML.android:layout_width"fill_parent"a…

橫空出世,席卷互聯網--評微軟等公司數據結構和算法面試100題

橫空出世&#xff0c;席卷互聯網 ---評微軟數據結構算法面試100題 作者&#xff1a;July。 時間&#xff1a;2010年10月-11月。版權所有&#xff0c;侵權必究。 出處&#xff1a;http://blog.csdn.net/v_JULY_v。 說明&#xff1a;本文原題為&#xff1a;“橫空出世&#xff0c…

收銀管理系統怎樣幫助商家很好地經營服裝門店

收銀管理系統對于服裝門店的經營可以提供多方面的幫助&#xff0c;以下是一些具體的優勢和功能&#xff1a; 1. 快速準確的收銀&#xff1a;收銀管理系統可以實現快速、準確的收銀操作&#xff0c;通過條碼掃描或手動輸入商品信息&#xff0c;自動計算價格并生成收據。這樣可以…

BZOJ 1567: [JSOI2008]Blue Mary的戰役地圖

二次聯通門 : BZOJ 1567: [JSOI2008]Blue Mary的戰役地圖 /*BZOJ 1567: [JSOI2008]Blue Mary的戰役地圖社會我棟哥人慫P話多暴力能A題正解能WA0*/ #include <cstdio> #include <iostream>#define rg register inline void read (int &n) {rg char c getchar (…

python模擬輸入回車鍵_用Python模擬鍵盤輸入

import win32apiimport win32conwin32api.keybd_event(17,0,0,0) #ctrl鍵位碼是17win32api.keybd_event(86,0,0,0) #v鍵位碼是86win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #釋放按鍵win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)附個鍵位碼表&#xff…

Python 之 進程

目錄 理論知識 操作系統背景知識 進程 什么是進程 進程調度 進程的并行與并發 同步異步阻塞非阻塞 同步和異步 阻塞與非阻塞 同步/異步與阻塞/非阻塞 組合 進程的創建與結束 進程的創建 進程的結束 在python程序中的進程操作 multiprocess&#xff08;multiproc…

從全息投影到全息平臺,必須克服7個障礙

“每個科幻愛好者和癡迷技術的人兒都希望能擁有一個全息成像臺。不幸的是&#xff0c;制造全息平臺的技術還尚未被人類掌握。據說我們離這項技術可用之時還有大約10到15年的時間——這是 AMD 的專業人士 Phil Rogers 說的&#xff0c;他專攻 3D 技術工作已超過20年。在《今日宇…

android fragment fragmenttransaction,Android FragmentTransaction 常用方法總結

FragmentManage&#xff1a;FragmentManager能夠實現管理activity中fragment. 通過調用activity的getFragmentManager()取得它的實例.FragmentManager可以做如下一些事情:1、使用findFragmentById() (用于在activity ...public class Toolkit { /** * * Role:Telec…

IBM總架構師寇衛東:話說程序員的職業生涯-IT程序人生-職業生涯規劃

初級程序員和高級程序員時期&#xff0c;都屬于職業生涯發展的第一階段&#xff0c;我們可以稱之為黃金時期。這階段程序員的年齡在20~35歲之間&#xff0c;因為年輕&#xff0c;所以更善于學習&#xff0c;而且體力充沛&#xff0c;很多走過這個階段的程序員有過通宵工作的經歷…