網站首頁 編程語言 正文
1、python 操作xml的方式介紹
查看全部包含“三種?法:
- ?是xml.dom. * 模塊,它是W3CDOMAPI的實現,若需要處理DOMAPI則該模塊很適合;
- ??是xml.sax. * 模塊,它是SAXAPI的實現,這個模塊犧牲了便捷性來換取速度和內存占?,SAX是?個基于事件的API,這就意味著它可以“在空中”處理龐?數量的的?檔,不?完全加載進內存;
- 三是xml.etree.ElementTree模塊(簡稱 ET),它提供了輕量級的Python式的API,相對于DOM來說ET 快了很多,?且有很多令?愉悅的API可以使?,相對于SAX來說ET的ET.iterparse也提供了 “在空中” 的處理?式,沒有必要加載整個?檔到內存,ET的性能的平均值和SAX差不多,但是API的效率更??點?且使?起來很?便。”的文檔
2、ElementTree模塊
解析xml文件并獲取根節點:
from xml.etree import ElementTree as ET
# 1、打開xml文件
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 獲xml文件的內容取根標簽
root = tree.getroot()
print(root)
3、解析xml格式字符串并獲取根節點
注意xml格式的內容應該沒有xml格式聲明的內容“<?xml version="1.0" encoding="UTF-8"?>”,
如果有則會解析錯誤:
content = """ <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="關聯關系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、讀取節點內容,getroot()
獲取標簽名,獲取標簽屬性及獲取標簽文本:
# 1、打開xml文件
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 獲xml文件的內容取根標簽
root = tree.getroot()
# 2、讀取節點內容
# 2.1 獲取根標簽下的子標簽
for child in root: 獲取根節點下的子標簽
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文件的內容取根標簽
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文件的內容取根標簽
root = tree.getroot()
print(root)
# 2.2 根據標簽名全文搜索標簽
Code_object = root.iter("Code") 全文搜索標簽名為“Code”的標簽
print(Code_object)
for code in Code_object:
print(code.tag, code.attrib)
7、修改節點
from xml.etree import ElementTree as ET
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 獲xml文件的內容取根標簽
root = tree.getroot()
relation_object = root.find("Events").find("Event").iter("Relation") # 獲取第一個Events的一級子標簽下的Relation子標簽
for relation_cell in relation_object:
relation_cell.set("productCode", "產品編碼") # 如果有相應屬性,則修改屬性值,沒有則新增
relation_cell.set("productCode2", "產品編碼2")
relation_cell.find("Batch").find("Code").text="追溯碼" # 注意:如果之前是短標簽,增加文本屬性后自動變為長標簽。
tree = ET.ElementTree(root)
tree.write("new.xml", encoding="utf-8",short_empty_elements=True) # 如果文件不存在,則創建文件,如果文件已存在則修改響應內容
8、刪除節點
from xml.etree import ElementTree as ET
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 獲xml文件的內容取根標簽
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") # 如果文件不存在,則創建文件,如果文件已存在則修改響應內容
9、構建文件
方式1 (Element)
先創建各類標簽,再建立標簽之間關系:
from xml.etree import ElementTree as ET
# 創建根標簽
root = ET.Element("root")
# 創建一個標簽tagName1
tagName1 = ET.Element("tagName1", {"tag1Attribute":"AttributeValue1"})
# 創建一個標簽tagName2
tagName2 = ET.Element("tagName2", {"tag2Attribute":"AttributeValue2"})
# 創建一個標簽tagName11
tagName11 = ET.Element("tagName11", {"tag11Attribute":"AttributeValue11"})
# 創建一個標簽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 規定是短標簽(單標簽)還是雙標簽
<?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
# 創建根節點
root = ET.Element("family")
# 創建一級子標簽
son1 = root.makeelement("son", {"name":"son1"})
son2 = root.makeelement("son", {"name":"son2"})
# 創建二級子標簽
grandson1 = son1.makeelement("grandson1", {"name":"grandson1"})
grandson2 = son1.makeelement("grandson1", {"name":"grandson2"})
# 將二級子標簽與一級子標簽關聯
son1.append(grandson1)
son1.append(grandson2)
# 將一級子標簽與根標簽關聯
root.append(son2)
root.append(son1)
tree = ET.ElementTree(root)
tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8")
方式3
此種方式是在創建元素時直接建立相關關系:
from xml.etree import ElementTree as ET
# 創建根節點
root = ET.Element("family")
# 創建一級子標簽
son1 = ET.SubElement(root, "son", {"name":"son1"})
son2 = ET.SubElement(root,"son", {"name":"son2"})
# 創建二級子標簽
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>
原文鏈接:https://blog.csdn.net/Mwyldnje2003/article/details/125819447
相關推薦
- 2023-08-28 React安裝ant design組件庫,并使用
- 2022-08-27 C#從前面或后面按指定數量刪除字符串_C#教程
- 2022-07-11 Android星級評分條實現評分界面_Android
- 2022-11-06 Django中Migrate和Makemigrations實操詳解_python
- 2022-10-05 Iptables防火墻tcp-flags模塊擴展匹配規則詳解_安全相關
- 2022-10-12 python繪制發散型柱狀圖+誤差陰影時間序列圖+雙坐標系時間序列圖+繪制金字塔圖_python
- 2022-09-03 React實現輪播圖效果_React
- 2022-07-06 R語言繪制條形圖及分布密度圖代碼總結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支