最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python全方位操作XML文件的方法完整指南

 更新時(shí)間:2026年04月09日 08:19:15   作者:detayun  
在數(shù)據(jù)交換和存儲(chǔ)領(lǐng)域,XML(可擴(kuò)展標(biāo)記語言)憑借其靈活性和可讀性占據(jù)著重要地位,本文將深入探討Python操作XML文件的多種方法,并結(jié)合實(shí)際案例進(jìn)行詳細(xì)說明,希望對(duì)大家有所幫助

在數(shù)據(jù)交換和存儲(chǔ)領(lǐng)域,XML(可擴(kuò)展標(biāo)記語言)憑借其靈活性和可讀性占據(jù)著重要地位。Python作為一門功能強(qiáng)大的編程語言,提供了多種方式來操作XML文件,無論是讀取、寫入、修改還是刪除,都能輕松應(yīng)對(duì)。本文將深入探討Python操作XML文件的多種方法,并結(jié)合實(shí)際案例進(jìn)行詳細(xì)說明。

一、XML文件基礎(chǔ)

XML文件由一系列標(biāo)簽組成,這些標(biāo)簽可以包含屬性,標(biāo)簽之間可以嵌套,形成樹狀結(jié)構(gòu)。例如,一個(gè)簡(jiǎn)單的XML文件可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<library>
    <book id="1001">
        <title>Python編程</title>
        <author>埃里克·馬瑟斯</author>
        <price>89.0</price>
    </book>
    <book id="1002">
        <title>XML基礎(chǔ)教程</title>
        <author>李四</author>
        <price>59.0</price>
    </book>
</library>

這個(gè)XML文件描述了一個(gè)圖書館的藏書信息,包含了兩本書的詳細(xì)信息,每本書都有唯一的id屬性,以及title、authorprice等子標(biāo)簽。

二、Python操作XML文件的常用庫

Python標(biāo)準(zhǔn)庫中提供了多種處理XML文件的方式,主要包括xml.etree.ElementTree、xml.dom.minidomxml.sax。此外,還有第三方庫lxml,它提供了更強(qiáng)大的功能和更好的性能。

1.xml.etree.ElementTree(ET)

xml.etree.ElementTree是Python標(biāo)準(zhǔn)庫中用于處理XML文件的輕量級(jí)庫,它提供了簡(jiǎn)單易用的API,能夠滿足大多數(shù)XML處理場(chǎng)景的需求。ET具有占用內(nèi)存小、速度快、使用方便等優(yōu)點(diǎn),是處理XML文件的首選庫。

讀取XML文件

使用ET讀取XML文件非常簡(jiǎn)單,只需調(diào)用ET.parse()函數(shù)即可。該函數(shù)接受一個(gè)文件路徑作為參數(shù),返回一個(gè)ElementTree對(duì)象,通過該對(duì)象的getroot()方法可以獲取XML文件的根元素。

import xml.etree.ElementTree as ET

# 讀取XML文件
tree = ET.parse('library.xml')
root = tree.getroot()

# 遍歷根元素的子元素
for book in root:
    book_id = book.get('id')
    title = book.find('title').text
    author = book.find('author').text
    price = book.find('price').text
    print(f"ID: {book_id}, 標(biāo)題: {title}, 作者: {author}, 價(jià)格: {price}")

上述代碼首先讀取library.xml文件,然后遍歷根元素<library>的子元素<book>,獲取每本書的id、titleauthorprice信息,并打印出來。

寫入XML文件

使用ET寫入XML文件需要先創(chuàng)建根元素,然后通過ET.SubElement()函數(shù)創(chuàng)建子元素,并設(shè)置子元素的文本內(nèi)容和屬性。最后,將根元素封裝成ElementTree對(duì)象,并調(diào)用write()方法將XML文件寫入磁盤。

import xml.etree.ElementTree as ET

# 創(chuàng)建根元素
root = ET.Element('library')

# 創(chuàng)建第一本書的元素
book1 = ET.SubElement(root, 'book', id='1003')
ET.SubElement(book1, 'title').text = 'Java編程'
ET.SubElement(book1, 'author').text = '張三'
ET.SubElement(book1, 'price').text = '79.0'

# 創(chuàng)建第二本書的元素
book2 = ET.SubElement(root, 'book', id='1004')
ET.SubElement(book2, 'title').text = 'C++編程'
ET.SubElement(book2, 'author').text = '李四'
ET.SubElement(book2, 'price').text = '85.0'

# 創(chuàng)建ElementTree對(duì)象并寫入文件
tree = ET.ElementTree(root)
tree.write('new_library.xml', encoding='utf-8', xml_declaration=True)

上述代碼創(chuàng)建了一個(gè)新的XML文件new_library.xml,包含了兩本書的信息。

修改XML文件

修改XML文件通常需要先讀取文件,然后找到需要修改的元素,修改其文本內(nèi)容或?qū)傩?,最后將修改后的XML文件保存到磁盤。

import xml.etree.ElementTree as ET

# 讀取XML文件
tree = ET.parse('library.xml')
root = tree.getroot()

# 修改第一本書的價(jià)格
for book in root:
    if book.get('id') == '1001':
        price_elem = book.find('price')
        price_elem.text = '85.0'
        price_elem.set('currency', 'CNY')

# 保存修改后的XML文件
tree.write('modified_library.xml', encoding='utf-8', xml_declaration=True)

上述代碼將id1001的書的price標(biāo)簽的文本內(nèi)容修改為85.0,并添加了一個(gè)currency屬性。

刪除XML文件中的元素

刪除XML文件中的元素需要先找到需要?jiǎng)h除的元素,然后調(diào)用父元素的remove()方法將其刪除。

import xml.etree.ElementTree as ET

# 讀取XML文件
tree = ET.parse('library.xml')
root = tree.getroot()

# 刪除id為1002的書
for book in root:
    if book.get('id') == '1002':
        root.remove(book)

# 保存修改后的XML文件
tree.write('deleted_library.xml', encoding='utf-8', xml_declaration=True)

上述代碼將id1002的書從XML文件中刪除。

2.xml.dom.minidom

xml.dom.minidom是Python標(biāo)準(zhǔn)庫中用于解析和操作XML文件的DOM實(shí)現(xiàn)。DOM將整個(gè)XML文件讀入內(nèi)存,并解析為一個(gè)樹狀結(jié)構(gòu),通過對(duì)樹的操作來操作XML文件。DOM方式占用內(nèi)存較大,解析速度較慢,但提供了豐富的API,可以方便地進(jìn)行各種操作。

讀取XML文件

使用xml.dom.minidom讀取XML文件需要調(diào)用parse()函數(shù),該函數(shù)接受一個(gè)文件路徑作為參數(shù),返回一個(gè)Document對(duì)象。通過該對(duì)象的documentElement屬性可以獲取XML文件的根元素。

from xml.dom.minidom import parse

# 讀取XML文件
dom = parse('library.xml')
root = dom.documentElement

# 獲取所有book元素
books = root.getElementsByTagName('book')
for book in books:
    book_id = book.getAttribute('id')
    title = book.getElementsByTagName('title')[0].childNodes[0].nodeValue
    author = book.getElementsByTagName('author')[0].childNodes[0].nodeValue
    price = book.getElementsByTagName('price')[0].childNodes[0].nodeValue
    print(f"ID: {book_id}, 標(biāo)題: {title}, 作者: {author}, 價(jià)格: {price}")

上述代碼讀取library.xml文件,獲取所有<book>元素,并打印每本書的id、title、authorprice信息。

寫入XML文件

使用xml.dom.minidom寫入XML文件需要先創(chuàng)建Document對(duì)象,然后創(chuàng)建根元素和子元素,并設(shè)置子元素的文本內(nèi)容和屬性。最后,調(diào)用toprettyxml()方法將XML文件格式化為字符串,并寫入磁盤。

from xml.dom.minidom import Document

# 創(chuàng)建Document對(duì)象
doc = Document()

# 創(chuàng)建根元素
root = doc.createElement('library')
doc.appendChild(root)

# 創(chuàng)建第一本書的元素
book1 = doc.createElement('book')
book1.setAttribute('id', '1003')
root.appendChild(book1)

title1 = doc.createElement('title')
title1.appendChild(doc.createTextNode('Java編程'))
book1.appendChild(title1)

author1 = doc.createElement('author')
author1.appendChild(doc.createTextNode('張三'))
book1.appendChild(author1)

price1 = doc.createElement('price')
price1.appendChild(doc.createTextNode('79.0'))
book1.appendChild(price1)

# 創(chuàng)建第二本書的元素
book2 = doc.createElement('book')
book2.setAttribute('id', '1004')
root.appendChild(book2)

title2 = doc.createElement('title')
title2.appendChild(doc.createTextNode('C++編程'))
book2.appendChild(title2)

author2 = doc.createElement('author')
author2.appendChild(doc.createTextNode('李四'))
book2.appendChild(author2)

price2 = doc.createElement('price')
price2.appendChild(doc.createTextNode('85.0'))
book2.appendChild(price2)

# 將XML文件寫入磁盤
xml_str = doc.toprettyxml(indent='    ')
with open('new_library_dom.xml', 'w', encoding='utf-8') as f:
    f.write(xml_str)

上述代碼創(chuàng)建了一個(gè)新的XML文件new_library_dom.xml,包含了兩本書的信息。

3.xml.sax

xml.sax是Python標(biāo)準(zhǔn)庫中用于解析XML文件的SAX實(shí)現(xiàn)。SAX采用流式處理方式,逐行掃描XML文件,邊掃描邊解析,占用內(nèi)存較小,速度較快,但需要用戶實(shí)現(xiàn)回調(diào)函數(shù)來處理解析過程中觸發(fā)的事件。

讀取XML文件

使用xml.sax讀取XML文件需要定義一個(gè)繼承自ContentHandler的類,并實(shí)現(xiàn)其中的startElement()、endElement()characters()方法。然后,創(chuàng)建一個(gè)SAXParser對(duì)象,并設(shè)置其ContentHandler為自定義的類,最后調(diào)用parse()方法解析XML文件。

import xml.sax

class BookHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.current_data = ''
        self.book_id = ''
        self.title = ''
        self.author = ''
        self.price = ''

    def startElement(self, tag, attributes):
        self.current_data = tag
        if tag == 'book':
            self.book_id = attributes['id']

    def endElement(self, tag):
        if tag == 'title':
            print(f"標(biāo)題: {self.title}")
        elif tag == 'author':
            print(f"作者: {self.author}")
        elif tag == 'price':
            print(f"價(jià)格: {self.price}")
        self.current_data = ''

    def characters(self, content):
        if self.current_data == 'title':
            self.title = content
        elif self.current_data == 'author':
            self.author = content
        elif self.current_data == 'price':
            self.price = content

# 創(chuàng)建SAXParser對(duì)象并解析XML文件
parser = xml.sax.make_parser()
handler = BookHandler()
parser.setContentHandler(handler)
parser.parse('library.xml')

上述代碼定義了一個(gè)BookHandler類,用于處理解析過程中觸發(fā)的事件。然后,創(chuàng)建一個(gè)SAXParser對(duì)象,并設(shè)置其ContentHandlerBookHandler,最后調(diào)用parse()方法解析library.xml文件。

4.lxml

lxml是一個(gè)第三方庫,它提供了比xml.etree.ElementTree更強(qiáng)大的功能和更好的性能。lxml支持XPath查詢、XSLT轉(zhuǎn)換、Schema校驗(yàn)等高級(jí)功能,是處理復(fù)雜XML文件的理想選擇。

安裝lxml

使用pip安裝lxml庫:

pip install lxml

讀取XML文件

使用lxml讀取XML文件與使用xml.etree.ElementTree類似,只需調(diào)用etree.parse()函數(shù)即可。

from lxml import etree

# 讀取XML文件
tree = etree.parse('library.xml')
root = tree.getroot()

# 使用XPath查詢所有價(jià)格大于60的書
high_price_books = root.xpath('.//book[price>60]')
for book in high_price_books:
    title = book.find('title').text
    print(f"高價(jià)書: {title}")

上述代碼使用XPath查詢所有價(jià)格大于60的書,并打印其標(biāo)題。

寫入XML文件

使用lxml寫入XML文件需要先創(chuàng)建根元素,然后通過etree.SubElement()函數(shù)創(chuàng)建子元素,并設(shè)置子元素的文本內(nèi)容和屬性。最后,將根元素封裝成ElementTree對(duì)象,并調(diào)用write()方法將XML文件寫入磁盤。

from lxml import etree

# 創(chuàng)建根元素
root = etree.Element('library')

# 創(chuàng)建第一本書的元素
book1 = etree.SubElement(root, 'book', id='1003')
etree.SubElement(book1, 'title').text = 'Java編程'
etree.SubElement(book1, 'author').text = '張三'
etree.SubElement(book1, 'price').text = '79.0'

# 創(chuàng)建第二本書的元素
book2 = etree.SubElement(root, 'book', id='1004')
etree.SubElement(book2, 'title').text = 'C++編程'
etree.SubElement(book2, 'author').text = '李四'
etree.SubElement(book2, 'price').text = '85.0'

# 創(chuàng)建ElementTree對(duì)象并寫入文件
tree = etree.ElementTree(root)
tree.write('new_library_lxml.xml', pretty_print=True, encoding='utf-8', xml_declaration=True)

上述代碼創(chuàng)建了一個(gè)新的XML文件new_library_lxml.xml,包含了兩本書的信息,并使用pretty_print=True參數(shù)使XML文件格式化輸出。

三、總結(jié)

Python提供了多種方式來操作XML文件,包括xml.etree.ElementTreexml.dom.minidom、xml.saxlxmlxml.etree.ElementTree是處理XML文件的首選庫,它具有占用內(nèi)存小、速度快、使用方便等優(yōu)點(diǎn)。xml.dom.minidom提供了豐富的API,但占用內(nèi)存較大,解析速度較慢。xml.sax采用流式處理方式,占用內(nèi)存較小,速度較快,但需要用戶實(shí)現(xiàn)回調(diào)函數(shù)。lxml是一個(gè)第三方庫,提供了比xml.etree.ElementTree更強(qiáng)大的功能和更好的性能,支持XPath查詢、XSLT轉(zhuǎn)換、Schema校驗(yàn)等高級(jí)功能。

在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體需求選擇合適的庫來操作XML文件。對(duì)于簡(jiǎn)單的XML處理場(chǎng)景,xml.etree.ElementTree通常能夠滿足需求;對(duì)于復(fù)雜的XML處理場(chǎng)景,lxml可能是更好的選擇。

以上就是Python全方位操作XML文件的方法完整指南的詳細(xì)內(nèi)容,更多關(guān)于Python操作XML文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解python os.walk()方法的使用

    詳解python os.walk()方法的使用

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞python os.walk()方法的使用展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python如何實(shí)用File文件的實(shí)現(xiàn)

    Python如何實(shí)用File文件的實(shí)現(xiàn)

    本文主要介紹了Python如何實(shí)用File文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python實(shí)現(xiàn)簡(jiǎn)單求解給定整數(shù)的質(zhì)因數(shù)算法示例

    Python實(shí)現(xiàn)簡(jiǎn)單求解給定整數(shù)的質(zhì)因數(shù)算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單求解給定整數(shù)的質(zhì)因數(shù)算法,結(jié)合實(shí)例形式分析了Python正整數(shù)分解質(zhì)因數(shù)的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • cython加速python代碼的方法實(shí)現(xiàn)

    cython加速python代碼的方法實(shí)現(xiàn)

    本文主要介紹了cython加速python代碼的方法實(shí)現(xiàn),特別是在涉及到數(shù)值計(jì)算密集型任務(wù)時(shí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Django零基礎(chǔ)入門之調(diào)用漂亮的HTML前端頁面

    Django零基礎(chǔ)入門之調(diào)用漂亮的HTML前端頁面

    這篇文章主要介紹了Django零基礎(chǔ)入門之調(diào)用漂亮的HTML前端頁面的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python爬蟲模塊URL管理器模塊用法解析

    python爬蟲模塊URL管理器模塊用法解析

    這篇文章主要介紹了python爬蟲模塊URL管理器模塊用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • pyqt和pyside開發(fā)圖形化界面

    pyqt和pyside開發(fā)圖形化界面

    選擇PyQt或PySide來開發(fā)圖形界面是因?yàn)镻ython和Qt的跨平臺(tái)特性,Qt5甚至支持iOS和Android,并且開發(fā)相同的軟件,Python的效率是極高的,下面看使用示例
    2014-01-01
  • python手動(dòng)拋出異常的操作方法

    python手動(dòng)拋出異常的操作方法

    在Python中,可以使用raise關(guān)鍵字手動(dòng)拋出異常,通過定義自定義異常類并使用raise語句來拋出異常,拋出異常后,如果沒有被捕獲,程序會(huì)終止并顯示異常信息,本文介紹python手動(dòng)拋出異常的操作方法,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • python實(shí)現(xiàn)WebSocket服務(wù)端過程解析

    python實(shí)現(xiàn)WebSocket服務(wù)端過程解析

    這篇文章主要介紹了python實(shí)現(xiàn)WebSocket服務(wù)端過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python爬取騰訊視頻評(píng)論的思路詳解

    Python爬取騰訊視頻評(píng)論的思路詳解

    這篇文章主要介紹了Python爬取騰訊視頻評(píng)論功能,本文圖文詳解給大家提供實(shí)現(xiàn)思路,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

扎鲁特旗| 巩留县| 西华县| 镇雄县| 青河县| 公主岭市| 乐亭县| 龙岩市| 琼结县| 霍林郭勒市| 公安县| 故城县| 高陵县| 正镶白旗| 辽宁省| 泊头市| 泰和县| 囊谦县| 合阳县| 遵义县| 剑阁县| 措美县| 萨嘎县| 景洪市| 平舆县| 屏边| 遂溪县| 盐津县| 泰安市| 昭觉县| 萍乡市| 新巴尔虎左旗| 即墨市| 绍兴县| 高安市| 湄潭县| 丹江口市| 响水县| 邻水| 淮北市| 托克逊县|