午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python使用ElementTree美化XML格式的操作

瀏覽:145日期:2022-08-03 14:48:01

Python中使用ElementTree可以很方便的處理XML,但是產(chǎn)生的XML文件內(nèi)容會(huì)合并在一行,難以看清楚。

如下格式:

<root><aa>aatext<cc>cctext</cc></aa><bb>bbtext<dd>ddtext<ee>eetext</ee></dd></bb></root>

使用minidom模塊中的toprettyxml和writexml方法都有參數(shù)可以優(yōu)化XML,但是有兩個(gè)問(wèn)題:

a. 如果解析的XML已經(jīng)是美化過(guò)的,那么執(zhí)行該方法會(huì)多出很多空行

b. 產(chǎn)生的結(jié)果會(huì)將text也獨(dú)立一行,如下:

<root> <aa> aatext </aa> <bb> bbtext </bb> </root>

而我想產(chǎn)生如下結(jié)果:

<root> <aa>aatext</aa> <bb>bbtext</bb> </root>

于是只能自己寫一個(gè)美化XML的方法。

我們首先研究一下ElementTree模塊中的Element類,使用getroot方法返回的便是Element類。

該類中有四個(gè)屬性tag、attrib、text與tail, 對(duì)應(yīng)在XML中如下圖所示:

Python使用ElementTree美化XML格式的操作

整個(gè)XML就是一個(gè)Element,里面嵌套了很多子Element。

Element可以使用for循環(huán)迭代。

通過(guò)在text和tail中增加換行和制表符,就可以實(shí)現(xiàn)美化XML的目的。

美化代碼如下:

def prettyXml(element, indent, newline, level = 0): # elemnt為傳進(jìn)來(lái)的Elment類,參數(shù)indent用于縮進(jìn),newline用于換行 if element: # 判斷element是否有子元素 if element.text == None or element.text.isspace(): # 如果element的text沒(méi)有內(nèi)容 element.text = newline + indent * (level + 1) else: element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1) #else: # 此處兩行如果把注釋去掉,Element的text也會(huì)另起一行 #element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level temp = list(element) # 將elemnt轉(zhuǎn)成list for subelement in temp: if temp.index(subelement) < (len(temp) - 1): # 如果不是list的最后一個(gè)元素,說(shuō)明下一個(gè)行是同級(jí)別元素的起始,縮進(jìn)應(yīng)一致 subelement.tail = newline + indent * (level + 1) else: # 如果是list的最后一個(gè)元素, 說(shuō)明下一行是母元素的結(jié)束,縮進(jìn)應(yīng)該少一個(gè) subelement.tail = newline + indent * level prettyXml(subelement, indent, newline, level = level + 1) # 對(duì)子元素進(jìn)行遞歸操作 from xml.etree import ElementTree #導(dǎo)入ElementTree模塊 tree = ElementTree.parse(’test.xml’) #解析test.xml這個(gè)文件,該文件內(nèi)容如上文 root = tree.getroot() #得到根元素,Element類 prettyXml(root, ’t’, ’n’) #執(zhí)行美化方法 ElementTree.dump(root) #顯示出美化后的XML內(nèi)容

輸出結(jié)果如下:

<root> <aa> aatext <cc>cctext</cc> </aa> <bb> bbtext <dd> ddtext <ee>eetext</ee> </dd> </bb> </root>

殘留問(wèn)題點(diǎn):

windows下的換行符是'rn',只需將prettyXml方法的第三個(gè)參數(shù)改為'rn',使用記事本打開生成的XML大部分OK。

但是XML說(shuō)明與根元素開始符之間不知如何插入'rn'.

Python使用ElementTree美化XML格式的操作

補(bǔ)充知識(shí):python-xml 模塊-代碼生成xml 文檔

一、XML 模塊

什么是xml:可擴(kuò)展的標(biāo)記語(yǔ)言,標(biāo)記翻譯為標(biāo)簽,用標(biāo)簽來(lái)組織數(shù)據(jù)的語(yǔ)言,也是一種語(yǔ)言可以用來(lái)自定義文檔結(jié)構(gòu)。相比json 使用場(chǎng)景更加廣泛,但是語(yǔ)法格式相比json 復(fù)雜很多

什么時(shí)候使用json:前后臺(tái)交互數(shù)據(jù)時(shí)使用json

什么時(shí)候使用xml:當(dāng)需要自定義文檔結(jié)構(gòu)時(shí)使用xml,比如java中經(jīng)常用xml來(lái)作為配置文件,常見(jiàn)操作就是通過(guò)程序去讀取配置信息,而修改增加刪除,一般是交給用戶來(lái)手動(dòng)完成

標(biāo)簽的叫發(fā):node(節(jié)點(diǎn))、elment(元素)、tag(標(biāo)簽)

需求從conuntrys中獲取所有的國(guó)家名稱

==========================>countrys<data> <country name='Liechtenstein'> <rank updated='yes'>2</rank> <year>2009</year> <gdppc>141100</gdppc> <neighbor direction='E' name='Austria' /> <neighbor direction='W' name='Switzerland' /> </country> <country name='Singapore'> <rank updated='yes'>5</rank> <year>2012</year> <gdppc>59900</gdppc> <neighbor direction='N' name='Malaysia' /> </country> <country name='Panama'> <rank updated='yes'>69</rank> <year>2012</year> <gdppc>13600</gdppc> <neighbor direction='W' name='Costa Rica' /> <neighbor direction='E' name='Colombia' /> </country></data># 取別名可以用于簡(jiǎn)化書寫import xml.etree.ElementTree as ETtree = ET.parse(’countrys’)#獲取根標(biāo)簽#第一種獲取標(biāo)簽的方式#全文查找iter() # 獲取迭代器 如果不指定參數(shù) 則迭代器迭代的是所有標(biāo)簽print(root.iter())# 獲取迭代器 如果指定參數(shù) 則迭代器迭代的是所有名稱匹配的標(biāo)簽for e in root.iter('rank'): print(e) #第二種獲取標(biāo)簽的方式#在當(dāng)前標(biāo)簽下(所有子級(jí)標(biāo)簽)尋找第一個(gè)名稱匹配的標(biāo)簽print(root.find('rank')) #第一個(gè)名稱不匹配所以返回None#第三種獲取標(biāo)簽的方式#在當(dāng)前標(biāo)簽下(所有子級(jí)標(biāo)簽)尋找所有名稱匹配的標(biāo)簽print(root.findall('rank')) #[]

練習(xí):找到新加坡中year 這個(gè)標(biāo)簽

#print(e.tag) #標(biāo)簽名稱#print(e.attrib) #屬性 字典類型#print(e.text) #文本內(nèi)容import xml.etree.ElementTree as ETtree = ET.parse('countrys')# 獲取根標(biāo)簽root = tree.getroot()for e in root.iter('country'): if e.attrib['name'] == 'Singapore': y = e.find('year') print(y.text) #2012

在程序中修改文檔內(nèi)容:把所有year標(biāo)簽的文本加1

import xml.etree.ElementTree as ETtree = ET.parse('countrys')root = tree.getroot()for e in root.iter('year'): e.text = str(int(e.text) + 1) #做完修改后要將修改后的內(nèi)容寫入文件tree.write(’countrys’)

把新加坡國(guó)家刪除:

import xml.etree.ElementTree as ETtree = ET.parse('countrys')root = tree.getroot()for e in root.findall('country'): print(e) if e.attrib['name'] == 'Singapore': #刪除時(shí)要通過(guò)被刪除的父級(jí)標(biāo)簽來(lái)刪除 root.remove(e)tree.write(’countrys’)

用程序?qū)⒅袊?guó)信息寫入文檔中:

import xml.etree.ElementTree as ETtree = ET.parse('countrys')root = tree.getroot()#添加時(shí)也需要將要添加的數(shù)據(jù)做成一個(gè)Elementc = ET.Element('country',{'name':'china'})# 在國(guó)家下有一堆子標(biāo)簽ranke = ET.Element('ranke',{'updated':'yes'})c.append(ranke)year = ET.Element('year')year.text = '2018'c.append(year)#添加到root標(biāo)簽中root.append(c)tree.write('countrys')

總結(jié):一般不會(huì)通過(guò)程序 去修改 刪除 和添加

什么時(shí)候應(yīng)該使用XML格式:

當(dāng)你需要自定文檔結(jié)構(gòu)時(shí)(XML最強(qiáng)大的地方就是結(jié)構(gòu))

前后臺(tái)交互不應(yīng)該使用,前后臺(tái)交互應(yīng)該使用JSON格式

代碼生成XML文檔

import xml.etree.ElementTree as ET# 創(chuàng)建根標(biāo)簽root = ET.Element('root')root.text = '這是一個(gè)XML文檔!'c = ET.Element('country',{'name':'china'})root.append(c)tree = ET.ElementTree(root)# 參數(shù): 文件名稱 編碼方式 是否需要文檔聲明tree.write('new.xml',encoding='utf-8',xml_declaration=True)=========================>new.xml 內(nèi)容為<?xml version=’1.0’ encoding=’utf-8’?><root>這是一個(gè)XML文檔!<country name='china' /></root>

以上這篇Python使用ElementTree美化XML格式的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 天天操天天弄 | 亚洲天堂一区在线观看 | 日本高清视频一区二区 | 中文字幕第十一页 | 美国黄色a级片 | 91久久精品日日躁夜夜躁国产 | 91黄色大片 | 天天操狠狠操 | 国产成人精品综合久久久久99 | 九九精品国产 | 懂色av懂色av粉嫩av | gogogo免费高清日本写真 | 国产精品九九视频 | 超碰免费在线 | 青草草在线视频 | 天堂av免费在线 | 中文字幕av网址 | 国产h视频在线 | 亚洲激情国产 | 国产精品国产 | 伊人影院亚洲 | 在线播放毛片 | 成人一区av| 亚洲在线免费观看视频 | 亚洲精品字幕在线观看 | 成人精品一区二区三区中文字幕 | 日韩成人av网站 | 99久久久国产精品免费蜜臀 | 91亚洲精品国偷拍自产在线观看 | 女同性恋毛片 | 天天干天天干天天操 | 国产不卡网 | www.亚洲精品 | 欧美三区在线观看 | 欧美一区二区在线播放 | 久久久神马 | 国产精品第 | 午夜免费成人 | 一级黄色a| 国产成人精品影院 | 黄色国产精品 |