python處理xml文件操作詳解
1、python 操作xml的方式介紹
查看全部包含“三種?法:
- ?是xml.dom. * 模塊,它是W3CDOMAPI的實現(xiàn),若需要處理DOMAPI則該模塊很適合;
- ?是xml.sax. * 模塊,它是SAXAPI的實現(xiàn),這個模塊犧牲了便捷性來換取速度和內(nèi)存占?,SAX是?個基于事件的API,這就意味著它可以“在空中”處理龐?數(shù)量的的?檔,不?完全加載進內(nèi)存;
- 三是xml.etree.ElementTree模塊(簡稱 ET),它提供了輕量級的Python式的API,相對于DOM來說ET 快了很多,?且有很多令?愉悅的API可以使?,相對于SAX來說ET的ET.iterparse也提供了 “在空中” 的處理?式,沒有必要加載整個?檔到內(nèi)存,ET的性能的平均值和SAX差不多,但是API的效率更??點?且使?起來很?便。”的文檔
2、ElementTree模塊
解析xml文件并獲取根節(jié)點:
from xml.etree import ElementTree as ET # 1、打開xml文件 tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml") # 獲xml文件的內(nèi)容取根標簽 root = tree.getroot() print(root)
3、解析xml格式字符串并獲取根節(jié)點
注意xml格式的內(nèi)容應該沒有xml格式聲明的內(nèi)容“<?xml version="1.0" encoding="UTF-8"?>”,
如果有則會解析錯誤:
content = """ <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="關(guān)聯(lián)關(guān)系XML Schema-3.0.xsd" License=""> <Events version="3.0"> <Event name="RelationCreate"> <Relation productCode="06970593810109" subTypeNo="06970593810109" cascade="1" packageSpec="50人份/盒" comment="" linkProductCode="" assCorpCode=""> <Batch batchNo="N0530001" madeDate="2022-05-30" validateDate="2023-05-29" workshop="無" lineName="無" lineManager="無"> <Code curCode="010697059381010910N053000117230527" packLayer="1" parentCode="" flag="0" /> </Batch> </Relation> </Event> </Events> </Document> """ root2= ET.XML(content) print(root2)
4、讀取節(jié)點內(nèi)容,getroot()
獲取標簽名,獲取標簽屬性及獲取標簽文本:
# 1、打開xml文件 tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml") # 獲xml文件的內(nèi)容取根標簽 root = tree.getroot() # 2、讀取節(jié)點內(nèi)容 # 2.1 獲取根標簽下的子標簽 for child in root: 獲取根節(jié)點下的子標簽 print(child.tag) # *.tag 是獲取標簽名字(字符串類型) print( child.attrib) # *.attrib是獲取標簽屬性(字典類型) for node in child: 獲取跟標簽下子標簽的子標簽 print(node.tag) print(node.attrib) print(node.text) # *.text 獲取標簽文本
5、通標標簽名直接獲取標簽(find,findall)
find() # 此種寫法只能獲取根標簽下的一級子標簽,即只能查詢下一級標簽,不能查詢到下一級的下一級標簽,且找到的是第一個相應的標簽
findall()此種寫法只能獲取根標簽下的一級子標簽,即只能查詢下一級標簽,不能查詢到下一級的下一級標簽 ,但是找到下一級的所有符合名稱的標簽
# 1、打開xml文件 from xml.etree import ElementTree as ET # 1、打開xml文件 from xml.etree import ElementTree as ET tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml") # 獲xml文件的內(nèi)容取根標簽 root = tree.getroot() print(root) # 2.2 通過標簽名稱獲取標簽 find() events_object = root.find("Events") # 此種寫法只能獲取根標簽下的一級子標簽,即只能查詢下一級標簽,不能查詢到下一級的下一級標簽,**且找到的是第一個響應的標簽** print(events_object.tag, events_object.attrib) event_object = events_object.find("Event") # 進一步獲取跟標簽下子標簽的子標簽 print(event_object.tag,event_object.attrib) # 2.3 通過標簽名稱獲取標簽 findall() events_objects = root.findall("Events") # 此種寫法只能獲取根標簽下的一級子標簽,即只能查詢下一級標簽,不能查詢到下一級的下一級標簽,但是可以獲取下一級所有符合名稱的標簽 for event_clee in events_objects: print(event_clee.tag, event_clee.attrib) event_object = event_clee.findall("Event") # 進一步獲取跟標簽下子標簽的子標簽 for relation_cell in event_object: print(relation_cell.tag, relation_cell.attrib) # 2.4 findall(xpath) Events_object = root.findall('.//Code') Events_object1 = root.findall('.//Code[@curCode="010697059381010910N053000117230527"]') Events_object2 = root.findall('.//*[@curCode="010697059381010910N053000117230527"]') #注意 前面的“.”不能省略, print(Events_object) print(Events_object1) print(Events_object2[0])
6、全文搜索標簽名(類似xpath路徑查找標簽)
from xml.etree import ElementTree as ET # 1、打開xml文件 tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml") # 獲xml文件的內(nèi)容取根標簽 root = tree.getroot() print(root) # 2.2 根據(jù)標簽名全文搜索標簽 Code_object = root.iter("Code") 全文搜索標簽名為“Code”的標簽 print(Code_object) for code in Code_object: print(code.tag, code.attrib)
7、修改節(jié)點
from xml.etree import ElementTree as ET tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml") # 獲xml文件的內(nèi)容取根標簽 root = tree.getroot() relation_object = root.find("Events").find("Event").iter("Relation") # 獲取第一個Events的一級子標簽下的Relation子標簽 for relation_cell in relation_object: relation_cell.set("productCode", "產(chǎn)品編碼") # 如果有相應屬性,則修改屬性值,沒有則新增 relation_cell.set("productCode2", "產(chǎn)品編碼2") relation_cell.find("Batch").find("Code").text="追溯碼" # 注意:如果之前是短標簽,增加文本屬性后自動變?yōu)殚L標簽。 tree = ET.ElementTree(root) tree.write("new.xml", encoding="utf-8",short_empty_elements=True) # 如果文件不存在,則創(chuàng)建文件,如果文件已存在則修改響應內(nèi)容
8、刪除節(jié)點
from xml.etree import ElementTree as ET tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml") # 獲xml文件的內(nèi)容取根標簽 root = tree.getroot() # ####################錯誤的刪除方式######################## # # 獲取響應標簽 # Event_object = root.find("Events").find("Event") # # 刪除相應標簽 # root.remove(Event_object) # 刪除只能刪除其子標簽,不能刪除其子標簽下的子標簽,因為relation_object是子標簽下的子標簽,因此此時刪除失敗 ################## 正確的刪除方式############################# Events_object = root.find("Events") Event_object = Events_object.find("Event") Events_object.remove(Event_object) tree = ET.ElementTree(root) tree.write("new.xml", encoding="utf-8") # 如果文件不存在,則創(chuàng)建文件,如果文件已存在則修改響應內(nèi)容
9、構(gòu)建文件
方式1 (Element)
先創(chuàng)建各類標簽,再建立標簽之間關(guān)系:
from xml.etree import ElementTree as ET # 創(chuàng)建根標簽 root = ET.Element("root") # 創(chuàng)建一個標簽tagName1 tagName1 = ET.Element("tagName1", {"tag1Attribute":"AttributeValue1"}) # 創(chuàng)建一個標簽tagName2 tagName2 = ET.Element("tagName2", {"tag2Attribute":"AttributeValue2"}) # 創(chuàng)建一個標簽tagName11 tagName11 = ET.Element("tagName11", {"tag11Attribute":"AttributeValue11"}) # 創(chuàng)建一個標簽tagName12 tagName12 = ET.Element("tagName12", {"tag12Attribute":"AttributeValue12"}) # 將標簽tagName11和tagName12 添加的tagName1中作為tagName1的子標簽 tagName1.append(tagName11) tagName1.append(tagName12) # 將標簽tagName1和tagName2 添加的root中作為root的子標簽 root.append(tagName1) root.append(tagName2) # 保存 tree = ET.ElementTree(root) tree.write("newCreate.xml", xml_declaration=True, encoding="utf-8",short_empty_elements=True) # xml_declaration是否包含聲明文件, encoding編碼方式,short_empty_elements 規(guī)定是短標簽(單標簽)還是雙標簽
<?xml version='1.0' encoding='utf-8'?> <root> <tagName1 tag1Attribute="AttributeValue1"> <tagName11 tag11Attribute="AttributeValue11"/> <tagName12 tag12Attribute="AttributeValue12"/> </tagName1> <tagName2 tag2Attribute="AttributeValue2"/> </root>
方式2 (makeelement)
from xml.etree import ElementTree as ET # 創(chuàng)建根節(jié)點 root = ET.Element("family") # 創(chuàng)建一級子標簽 son1 = root.makeelement("son", {"name":"son1"}) son2 = root.makeelement("son", {"name":"son2"}) # 創(chuàng)建二級子標簽 grandson1 = son1.makeelement("grandson1", {"name":"grandson1"}) grandson2 = son1.makeelement("grandson1", {"name":"grandson2"}) # 將二級子標簽與一級子標簽關(guān)聯(lián) son1.append(grandson1) son1.append(grandson2) # 將一級子標簽與根標簽關(guān)聯(lián) root.append(son2) root.append(son1) tree = ET.ElementTree(root) tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8")
方式3
此種方式是在創(chuàng)建元素時直接建立相關(guān)關(guān)系:
from xml.etree import ElementTree as ET # 創(chuàng)建根節(jié)點 root = ET.Element("family") # 創(chuàng)建一級子標簽 son1 = ET.SubElement(root, "son", {"name":"son1"}) son2 = ET.SubElement(root,"son", {"name":"son2"}) # 創(chuàng)建二級子標簽 grandson1 = ET.SubElement(son1,"grandson1", {"name":"grandson1"}) grandson1.text="大孫子" grandson2 = ET.SubElement(son1,"grandson1", {"name":"grandson2"}) grandson2.text="小孫子" tree = ET.ElementTree(root) tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8")
<?xml version='1.0' encoding='utf-8'?> <family> <son name="son1"> <grandson1 name="grandson1">大孫子</grandson1> <grandson1 name="grandson2">小孫子</grandson1> </son> <son name="son2"/> </family>
到此這篇關(guān)于python處理xml文件操作詳解的文章就介紹到這了,更多相關(guān)python處理xml內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中json格式數(shù)據(jù)的編碼與解碼方法詳解
這篇文章主要介紹了Python中json格式數(shù)據(jù)的編碼與解碼方法,詳細分析了Python針對json格式數(shù)據(jù)的編碼轉(zhuǎn)換操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07Python中用post、get方式提交數(shù)據(jù)的方法示例
最近在學習使用Python,發(fā)現(xiàn)網(wǎng)上很少提到如何使用post,所以下面這篇文章主要給大家介紹了關(guān)于Python中用post、get方式提交數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-09-09python和pyqt實現(xiàn)360的CLable控件
這篇文章主要介紹了python和pyqt實現(xiàn)360的CLable控件示例,需要的朋友可以參考下2014-02-02Django中如何防范CSRF跨站點請求偽造攻擊的實現(xiàn)
這篇文章主要介紹了Django中如何防范CSRF跨站點請求偽造攻擊的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04經(jīng)驗豐富程序員才知道的15種高級Python小技巧(收藏)
本文將介紹15個簡潔的Python技巧,向著簡潔更高效,學習易懂出發(fā),具說只有經(jīng)驗豐富程序員才知道的15種高級Python小技巧,喜歡的朋友快來看看吧2021-10-10Python快速實現(xiàn)分列轉(zhuǎn)到行的示例代碼
這篇文章主要為大家詳細介紹了如何利用Python快速實現(xiàn)分列轉(zhuǎn)到行的效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學一下2023-03-03Django零基礎(chǔ)入門之自定義過濾器及模板中的使用
這篇文章主要介紹了Django零基礎(chǔ)入門之自定義過濾器及模板中的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09