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

Python格式化XML的三種常見(jiàn)方法詳解

 更新時(shí)間:2026年04月09日 08:16:45   作者:detayun  
XML是一種廣泛使用的標(biāo)記語(yǔ)言,用于存儲(chǔ)和傳輸結(jié)構(gòu)化數(shù)據(jù),本文主要介紹了Python中格式化XML的三種主要方法,并討論了不同方法的性能差異和適用場(chǎng)景,希望對(duì)大家有所幫助

XML(eXtensible Markup Language)是一種廣泛使用的標(biāo)記語(yǔ)言,用于存儲(chǔ)和傳輸結(jié)構(gòu)化數(shù)據(jù)。在Python開(kāi)發(fā)中,我們經(jīng)常需要處理XML數(shù)據(jù),包括解析、修改和生成XML。格式化XML(即美化輸出,添加適當(dāng)?shù)目s進(jìn)和換行)能顯著提高代碼的可讀性和調(diào)試效率。本文將詳細(xì)介紹如何在Python中對(duì)XML進(jìn)行格式化處理。

1. XML基礎(chǔ)回顧

XML由標(biāo)簽(tags)、屬性和文本內(nèi)容組成,具有層級(jí)結(jié)構(gòu)。一個(gè)簡(jiǎn)單的XML示例:

<person>
    <name>Alice</name>
    <age>25</age>
    <skills>
        <skill>Python</skill>
        <skill>Data Analysis</skill>
    </skills>
</person>

Python中處理XML的主要標(biāo)準(zhǔn)庫(kù)包括:

  • xml.etree.ElementTree(簡(jiǎn)稱ET):輕量級(jí),適合基本操作
  • minidom:提供DOM接口,支持格式化輸出
  • lxml:第三方庫(kù),功能強(qiáng)大,性能優(yōu)異

2. 使用xml.dom.minidom進(jìn)行格式化

minidom是Python標(biāo)準(zhǔn)庫(kù)的一部分,提供了簡(jiǎn)單的格式化方法:

2.1 基本格式化示例

from xml.dom import minidom

xml_str = """
<person>
<name>Alice</name><age>25</age>
<skills><skill>Python</skill><skill>Data Analysis</skill></skills>
</person>
"""

# 解析XML字符串
dom = minidom.parseString(xml_str)

# 獲取格式化后的XML字符串
formatted_xml = dom.toprettyxml(indent="  ", encoding="utf-8").decode()

print("格式化后的XML:")
print(formatted_xml)

輸出結(jié)果:

<?xml version="1.0" ?>
<person>
  <name>Alice</name>
  <age>25</age>
  <skills>
    <skill>Python</skill>
    <skill>Data Analysis</skill>
  </skills>
</person>

2.2 處理文件

# 從文件讀取并格式化
with open("input.xml", "r") as f:
    dom = minidom.parse(f)
    formatted_xml = dom.toprettyxml(indent="    ")

# 寫(xiě)入格式化后的XML到新文件
with open("output_formatted.xml", "w") as f:
    f.write(formatted_xml)

2.3 注意事項(xiàng)

  1. toprettyxml()默認(rèn)會(huì)添加X(jué)ML聲明(<?xml version="1.0" ?>
  2. 每次調(diào)用toprettyxml()都會(huì)在文本節(jié)點(diǎn)前后添加換行符,可能導(dǎo)致重復(fù)換行
  3. 對(duì)于大型XML文件,minidom可能不是最高效的選擇

3. 使用lxml庫(kù)進(jìn)行更專業(yè)的格式化

lxml是一個(gè)功能強(qiáng)大的第三方庫(kù),提供了更靈活的格式化選項(xiàng):

3.1 安裝lxml

pip install lxml

3.2 基本格式化示例

from lxml import etree

xml_str = """
<person>
<name>Alice</name><age>25</age>
<skills><skill>Python</skill><skill>Data Analysis</skill></skills>
</person>
"""

# 解析XML
root = etree.fromstring(xml_str)

# 創(chuàng)建ElementTree對(duì)象
tree = etree.ElementTree(root)

# 格式化輸出(方法1)
formatted_xml = etree.tostring(
    root, 
    pretty_print=True, 
    encoding="unicode", 
    xml_declaration=True
)

print("格式化后的XML:")
print(formatted_xml)

3.3 更精細(xì)的控制

lxml允許更精細(xì)地控制格式化:

# 更復(fù)雜的格式化選項(xiàng)
formatted_xml = etree.tostring(
    root,
    pretty_print=True,
    encoding="unicode",
    doctype='<!DOCTYPE person SYSTEM "person.dtd">',  # 可選DOCTYPE
    xml_declaration=True,
    with_tail=True  # 保留元素后的文本
)

3.4 處理文件

# 從文件讀取并格式化
parser = etree.XMLParser(remove_blank_text=True)  # 可選:移除空白文本
tree = etree.parse("input.xml", parser)

# 寫(xiě)入格式化后的XML
tree.write(
    "output_lxml.xml",
    pretty_print=True,
    encoding="utf-8",
    xml_declaration=True,
    doctype='<!DOCTYPE person SYSTEM "person.dtd">'
)

4. 使用xml.etree.ElementTree手動(dòng)格式化

雖然ElementTree本身不提供直接的格式化方法,但我們可以手動(dòng)實(shí)現(xiàn):

import xml.etree.ElementTree as ET

def prettify(element, indent="  ", level=0):
    """遞歸格式化ElementTree元素"""
    result = []
    # 處理元素開(kāi)始標(biāo)簽
    result.append(indent * level + f"<{element.tag}")
    if element.attrib:
        for k, v in element.attrib.items():
            result.append(f' {k}="{v}"')
    result.append(">\n")
    
    # 處理子元素
    for child in element:
        result.append(prettify(child, indent, level + 1))
    
    # 處理文本內(nèi)容
    if element.text and element.text.strip():
        result.append(indent * (level + 1) + element.text.strip() + "\n")
    
    # 處理元素結(jié)束標(biāo)簽
    result.append(indent * level + f"</{element.tag}>\n")
    
    return "".join(result)

# 示例使用
xml_str = """
<person>
<name>Alice</name><age>25</age>
<skills><skill>Python</skill><skill>Data Analysis</skill></skills>
</person>
"""

root = ET.fromstring(xml_str)
formatted_xml = prettify(root)

print("手動(dòng)格式化的XML:")
print(formatted_xml)

這種方法提供了最大的靈活性,但需要自己處理所有邊緣情況。

5. 實(shí)際應(yīng)用場(chǎng)景示例

5.1 美化API返回的XML

import requests
from lxml import etree

response = requests.get('https://example.com/api/data.xml')
if response.status_code == 200:
    root = etree.fromstring(response.content)
    pretty_xml = etree.tostring(
        root, 
        pretty_print=True, 
        encoding="unicode"
    )
    print("格式化后的API響應(yīng):")
    print(pretty_xml)
else:
    print(f"請(qǐng)求失敗,狀態(tài)碼: {response.status_code}")

5.2 配置文件處理

from lxml import etree

# 原始配置
config = """
<config>
<database><host>localhost</host><port>5432</port></database>
<logging level="INFO"/>
</config>
"""

# 解析并格式化
root = etree.fromstring(config)
formatted_config = etree.tostring(
    root,
    pretty_print=True,
    encoding="unicode",
    xml_declaration=True
)

# 保存到文件
with open("config_formatted.xml", "w") as f:
    f.write(formatted_config)

6. 性能比較

對(duì)于大型XML文件,不同方法的性能差異明顯:

import time
from xml.dom import minidom
from lxml import etree
import xml.etree.ElementTree as ET

# 生成大型XML
large_xml = "<root>" + "".join([f"<item id='{i}'/>" for i in range(10000)]) + "</root>"

# 測(cè)試minidom
start = time.time()
dom = minidom.parseString(large_xml)
_ = dom.toprettyxml()
print(f"minidom耗時(shí): {time.time()-start:.2f}秒")

# 測(cè)試lxml
start = time.time()
root = etree.fromstring(large_xml)
_ = etree.tostring(root, pretty_print=True, encoding="unicode")
print(f"lxml耗時(shí): {time.time()-start:.2f}秒")

# 測(cè)試ElementTree手動(dòng)格式化(僅小樣本)
small_xml = "<root>" + "".join([f"<item id='{i}'/>" for i in range(100)]) + "</root>"
start = time.time()
root = ET.fromstring(small_xml)
_ = prettify(root)
print(f"ElementTree手動(dòng)格式化耗時(shí): {time.time()-start:.2f}秒")

典型結(jié)果

minidom耗時(shí): 1.25秒
lxml耗時(shí): 0.05秒
ElementTree手動(dòng)格式化耗時(shí): 0.01秒(小樣本)

7. 總結(jié)與建議

  • 簡(jiǎn)單需求:使用xml.dom.minidomtoprettyxml()方法,它是標(biāo)準(zhǔn)庫(kù)的一部分,無(wú)需額外安裝
  • 專業(yè)需求:選擇lxml庫(kù),它提供更強(qiáng)大的功能和更好的性能
  • 特殊需求:如果需要完全控制格式化過(guò)程,可以考慮手動(dòng)實(shí)現(xiàn)或擴(kuò)展ElementTree方法
  • 性能關(guān)鍵場(chǎng)景:對(duì)于非常大的XML文件,lxml通常是最佳選擇
  • 避免重復(fù)換行minidom可能會(huì)產(chǎn)生重復(fù)換行,必要時(shí)需要后處理

推薦方案

  • 對(duì)于大多數(shù)應(yīng)用,lxml是最佳選擇,平衡了功能、性能和易用性
  • 如果項(xiàng)目環(huán)境不允許安裝第三方庫(kù),minidom是可行的替代方案
  • 只有在有非常特殊的需求時(shí),才考慮手動(dòng)實(shí)現(xiàn)格式化邏輯

通過(guò)合理選擇XML格式化方法,你可以顯著提高Python項(xiàng)目中XML數(shù)據(jù)的可讀性和可維護(hù)性。

到此這篇關(guān)于Python格式化XML的三種常見(jiàn)方法詳解的文章就介紹到這了,更多相關(guān)Python格式化XML內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 使用fileinput讀取文件

    python 使用fileinput讀取文件

    這篇文章主要介紹了python 使用fileinput讀取文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Django模板語(yǔ)言 Tags使用詳解

    Django模板語(yǔ)言 Tags使用詳解

    這篇文章主要介紹了Django模板語(yǔ)言 Tags使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python實(shí)現(xiàn)八皇后問(wèn)題示例代碼

    Python實(shí)現(xiàn)八皇后問(wèn)題示例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)八皇后問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python的文本常量與字符串模板之string庫(kù)

    Python的文本常量與字符串模板之string庫(kù)

    這篇文章主要介紹了Python的文本常量與字符串模板string庫(kù),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助喲,需要的朋友可以參考下
    2021-05-05
  • Python3 執(zhí)行Linux Bash命令的方法

    Python3 執(zhí)行Linux Bash命令的方法

    今天小編就為大家分享一篇Python3 執(zhí)行Linux Bash命令的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python爬蟲(chóng)之Spider類用法簡(jiǎn)單介紹

    Python爬蟲(chóng)之Spider類用法簡(jiǎn)單介紹

    這篇文章主要介紹了Python爬蟲(chóng)之Spider類用法簡(jiǎn)單介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python輕松寫(xiě)個(gè)課堂隨機(jī)點(diǎn)名系統(tǒng)

    Python輕松寫(xiě)個(gè)課堂隨機(jī)點(diǎn)名系統(tǒng)

    現(xiàn)在的學(xué)生大部分都很積極,會(huì)主動(dòng)舉手回答問(wèn)題。但是,也會(huì)遇到一些不好的情況,比如年級(jí)越高主動(dòng)舉手的人越少,所以本文寫(xiě)了一個(gè)隨機(jī)的學(xué)生點(diǎn)名系統(tǒng)可以幫老師解決這些問(wèn)題
    2023-01-01
  • 在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn)

    在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn)

    這篇文章主要介紹了在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python使用xpath獲取頁(yè)面元素的使用

    python使用xpath獲取頁(yè)面元素的使用

    本文主要介紹了python使用xpath獲取頁(yè)面元素的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 一文帶你理解Python中面向?qū)ο缶幊蘋(píng)OP的概念

    一文帶你理解Python中面向?qū)ο缶幊蘋(píng)OP的概念

    在Python中,面向?qū)ο缶幊蹋∣OP)是一種在編程中使用對(duì)象和類的編程范式,它旨在實(shí)現(xiàn)現(xiàn)實(shí)世界的實(shí)體,下面我們就一起來(lái)看看它的相關(guān)知識(shí)吧
    2023-08-08

最新評(píng)論

晋中市| 洛扎县| 雅江县| 南陵县| 萨嘎县| 织金县| 兴国县| 阿拉善左旗| 家居| 淮北市| 东安县| 沾化县| 大宁县| 手游| 鄂托克前旗| 金塔县| 江阴市| 平陆县| 怀化市| 定州市| 左贡县| 叙永县| 都江堰市| 东源县| 改则县| 隆回县| 阿克| 盐边县| 门头沟区| 平安县| 韶关市| 苏州市| 徐闻县| 巫山县| 黑山县| 徐州市| 武清区| 滕州市| 焦作市| 佳木斯市| 鲁山县|