首頁 > 軟體

python處理xml檔案操作詳解

2022-07-18 14:03:50

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.0TesttestDataN0530YPYM001.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.0TesttestDataN0530YPYM001.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.0TesttestDataN0530YPYM001.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.0TesttestDataN0530YPYM001.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.0TesttestDataN0530YPYM001.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.0TesttestDataN0530YPYM001.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>

到此這篇關於python處理xml檔案操作詳解的文章就介紹到這了,更多相關python處理xml內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com