欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年03月06日 13:27:11   作者:shinobiii  
這篇文章主要介紹了Python使用ElementTree美化XML格式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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ù)可以?xún)?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> 

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

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

該類(lèi)中有四個(gè)屬性tag、attrib、text與tail, 對(duì)應(yīng)在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類(lèi),參數(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類(lèi) 
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下的換行符是"\r\n",只需將prettyXml方法的第三個(gè)參數(shù)改為"\r\n",使用記事本打開(kāi)生成的XML大部分OK。

但是XML說(shuō)明與根元素開(kāi)始符之間不知如何插入"\r\n".

補(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ò)程序去讀取配置信息,而修改增加刪除,一般是交給用戶(hù)來(lái)手動(dòng)完成

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

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

==========================>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)化書(shū)寫(xiě)
import xml.etree.ElementTree as ET
tree = ET.parse('countrys')
#獲取根標(biāo)簽#第一種獲取標(biāo)簽的方式
#全文查找
iter() 
# 獲取迭代器 如果不指定參數(shù) 則迭代器迭代的是所有標(biāo)簽
print(root.iter())
# 獲取迭代器 如果指定參數(shù) 則迭代器迭代的是所有名稱(chēng)匹配的標(biāo)簽
for e in root.iter("rank"):
  print(e)
 
#第二種獲取標(biāo)簽的方式
#在當(dāng)前標(biāo)簽下(所有子級(jí)標(biāo)簽)尋找第一個(gè)名稱(chēng)匹配的標(biāo)簽
print(root.find("rank")) #第一個(gè)名稱(chēng)不匹配所以返回None#第三種獲取標(biāo)簽的方式
#在當(dāng)前標(biāo)簽下(所有子級(jí)標(biāo)簽)尋找所有名稱(chēng)匹配的標(biāo)簽
print(root.findall("rank")) #[]

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

#print(e.tag) #標(biāo)簽名稱(chēng)
#print(e.attrib) #屬性 字典類(lèi)型
#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)容寫(xiě)入文件
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ó)信息寫(xiě)入文檔中:

import xml.etree.ElementTree as ETtree = ET.parse("countrys")
root = tree.getroot()
#添加時(shí)也需要將要添加的數(shù)據(jù)做成一個(gè)Element
c = 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ù): 文件名稱(chēng) 編碼方式 是否需要文檔聲明
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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python包pdfkit(wkhtmltopdf)?將HTML轉(zhuǎn)換為PDF的操作方法

    python包pdfkit(wkhtmltopdf)?將HTML轉(zhuǎn)換為PDF的操作方法

    pdfkit,把HTML+CSS格式的文件轉(zhuǎn)換成PDF格式文檔的一種工具。它就是html轉(zhuǎn)成pdf工具包wkhtmltopdf的Python封裝。所以,必須手動(dòng)安裝wkhtmltopdf,這篇文章主要介紹了python包pdfkit(wkhtmltopdf)將HTML轉(zhuǎn)換為PDF,需要的朋友可以參考下
    2022-04-04
  • python操作sqlite的CRUD實(shí)例分析

    python操作sqlite的CRUD實(shí)例分析

    這篇文章主要介紹了python操作sqlite的CRUD實(shí)現(xiàn)方法,涉及Python操作SQLite數(shù)據(jù)庫(kù)CURD相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn)

    使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn)

    本文主要介紹了使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python Qt5實(shí)現(xiàn)窗體跟蹤鼠標(biāo)移動(dòng)

    python Qt5實(shí)現(xiàn)窗體跟蹤鼠標(biāo)移動(dòng)

    今天小編就為大家分享一篇python Qt5實(shí)現(xiàn)窗體跟蹤鼠標(biāo)移動(dòng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python操作MySQL的方法詳細(xì)解讀

    Python操作MySQL的方法詳細(xì)解讀

    這篇文章主要介紹了Python操作MySQL的方法詳細(xì)解讀,在Python中,通過(guò)使用第三方庫(kù):pymysql,完成對(duì)MySQL數(shù)據(jù)庫(kù)的操作,Python操作MySQL并不難,難點(diǎn)是如何編寫(xiě)合適的SQL語(yǔ)句,需要的朋友可以參考下
    2023-11-11
  • Python編寫(xiě)一個(gè)鬧鐘功能

    Python編寫(xiě)一個(gè)鬧鐘功能

    本文給大家分享一個(gè)python小程序之基于python編寫(xiě)的一個(gè)鬧鐘功能,需要的的朋友參考下實(shí)現(xiàn)代碼吧
    2017-07-07
  • python編程進(jìn)階之異常處理用法實(shí)例分析

    python編程進(jìn)階之異常處理用法實(shí)例分析

    這篇文章主要介紹了python編程進(jìn)階之異常處理用法,結(jié)合實(shí)例形式分析了python異常捕獲、處理相關(guān)語(yǔ)句、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    這篇文章主要介紹了Python3.7黑帽編程之病毒篇(基礎(chǔ)篇),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python中搜索和替換文件中的文本的實(shí)現(xiàn)(四種)

    Python中搜索和替換文件中的文本的實(shí)現(xiàn)(四種)

    本文主要介紹了Python中搜索和替換文件中的文本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • anaconda中安裝的python環(huán)境中沒(méi)有pip3的問(wèn)題及解決

    anaconda中安裝的python環(huán)境中沒(méi)有pip3的問(wèn)題及解決

    這篇文章主要介紹了anaconda中安裝的python環(huán)境中沒(méi)有pip3的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論