您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python如何操作XML文件”,在日常操作中,相信很多人在Python如何操作XML文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何操作XML文件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
XML(Extensible Markup Language):即可擴(kuò)展標(biāo)記語言,xml是互聯(lián)網(wǎng)數(shù)據(jù)傳輸?shù)闹匾ぞ撸梢钥缭交ヂ?lián)網(wǎng)任何的平臺,不受編程語言和的限制,可以說它是一個(gè)擁 有互聯(lián)網(wǎng)最高級別通行證的數(shù)據(jù)攜帶者。xml是當(dāng)前處理結(jié)構(gòu)化文檔信息中相當(dāng)給力的技術(shù),xml有 助于在服務(wù)器之間穿梭結(jié)構(gòu)化數(shù)據(jù),這使得開發(fā)人員更加得心應(yīng)手的控制數(shù)據(jù)的存儲和傳輸。
Xml用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是-種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語 言。Xml是標(biāo)準(zhǔn)通用標(biāo)記語言(SGML) 的子集,非常適合Web傳輸。XML提供統(tǒng)-的方法來描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。
特點(diǎn):
xm|與編程語言的開發(fā)平臺都無關(guān)
實(shí)現(xiàn)不同系統(tǒng)之間的數(shù)據(jù)交互。
作用:
配置應(yīng)用程序和網(wǎng)站;
數(shù)據(jù)交互;
Ajax基石。
聲明
根元素
子元素
屬性
命名空間
限定名
與HTML類似,XML是另一種將數(shù)據(jù)存儲在標(biāo)記之間的標(biāo)記語言。它是人類可讀和可擴(kuò)展的;也就是說,我們可以自由地定義自己的標(biāo)記。XML中的屬性、元素和標(biāo)記與HTML中的類似。XML文件可以有聲明,也可以沒有聲明。但是,如果它有一個(gè)聲明,那么它必須是XML文件的第一行。如:
<?xml version="1.0” encoding=' "UTF-8" standalone=" no”?>
這個(gè)聲明語句有三部分:版本、編碼和獨(dú)立性。版本說明正在使用的XML標(biāo)準(zhǔn)的版本; Encoding 表示在此文件中使用的字符編碼類型; Standalone 告訴解析器是否要外部信息來解釋XML文件的內(nèi)容。
XML文件可以表示為稱為: XML 樹。這個(gè)XML樹從根元素(父元素)開始。這個(gè)根元素進(jìn)一步分支到子元素。 XML文件的每個(gè)元素都是XML樹中的一個(gè)節(jié)點(diǎn)。那些沒有子節(jié)點(diǎn)的元素是葉節(jié)點(diǎn)。下圖清楚地區(qū)分了原始XML文件和XML文件的樹表示:
新建一個(gè)1.xml
文件:
<collection shelf="New Arrivals"> <class className="1班"> <code>2022001</code> <number>10</number> <teacher>小白</teacher> </class> <class className="2班"> <code>2022002</code> <number>20</number> <teacher>小紅</teacher> </class> <class className="3班"> <code>2022003</code> <number>30</number> <teacher>小黑</teacher> </class></collection>
ElementTree模塊提供了一個(gè)輕量級、Pythonic的API,同時(shí)還有一個(gè)高效的C語言實(shí)現(xiàn),即xml.etree.cElementTree。與DOM相比,ET的速度更快,API使用更直接、方便。與SAX相比,ET.iterparse函數(shù)同樣提供了按需解析的功能,不會一次性在內(nèi)存中讀入整個(gè)文檔。ET的性能與SAX模塊大致相仿,但是它的API更加高層次,用戶使用起來更加便捷。
Element對象方法:
類方法 | 說明 |
---|---|
Element.iter(tag=None) | 遍歷該Element所有后代,也可以指定tag進(jìn)行遍歷尋找。 |
Element.iterfind(path, namespaces=None) | 根據(jù)tag或path查找所有的后代。 |
Element.itertext() | 遍歷所有后代并返回text值。 |
Element.findall(path) | 查找當(dāng)前元素下tag或path能夠匹配的直系節(jié)點(diǎn) |
Element.findtext(path, default=None, namespaces=None) | 尋找第一個(gè)匹配子元素,返回其text值。匹配對象可以為tag或path。 |
Element.find(path) | 查找當(dāng)前元素下tag或path能夠匹配的首個(gè)直系節(jié)點(diǎn)。 |
Element.text | 獲取當(dāng)前元素的text值。 |
Element.get(key, default=None) | 獲取元素指定key對應(yīng)的屬性值,如果沒有該屬性,則返回default值。 |
Element.keys() | 返回元素屬性名稱列表 |
Element.items() | 返回(name,value)列表 |
Element.getchildren() | |
Element.getiterator(tag=None) | |
Element.getiterator(self, tag=None) |
屬性方法:
方法名 | 說明 |
---|---|
Element.tag | 節(jié)點(diǎn)名(tag)(str) |
Element.attrib | 屬性(attributes)(dict) |
Element.text | 文本(text)(str) |
Element.tail | 附加文本(tail) (str) |
Element[:] | 子節(jié)點(diǎn)列表(list) |
1)接下來,我們加載這個(gè)文檔,并進(jìn)行解析:
>>> import xml.etree.ElementTree as ET>>> tree = ET.ElementTree(file='1.xml')
2) 然后,我們獲取根元素(root element):
>>> tree.getroot()<Element 'collection' at 0x000001FCC9BBFA90>
3)根元素(root)是一個(gè)Element對象。我們看看根元素都有哪些屬性:
>>> root = tree.getroot()>>> root.tag, root.attrib('collection', {'shelf': 'New Arrivals'})
4)根元素也具備遍歷其直接子元素的接口:
>>> for child_of_root in root:... print(child_of_root.tag, child_of_root.attrib)...class {'className': '1班'}class {'className': '2班'}class {'className': '3班'}
5)通過索引值來訪問特定的子元素:
>>> root[0].tag, root[0].text('class', '\n\t ')
6) 查找需要的元素
從上面的示例中,可以明顯發(fā)現(xiàn)我們能夠通過簡單的遞歸方法(對每一個(gè)元素,遞歸式訪問其所有子元素)獲取樹中的所有元素。但是,由于這是十分常見的工作,ET提供了一些簡便的實(shí)現(xiàn)方法。
Element對象有一個(gè)iter方法,可以對某個(gè)元素對象之下所有的子元素進(jìn)行深度優(yōu)先遍歷(DFS)。ElementTree對象同樣也有這個(gè)方法。下面是查找XML文檔中所有元素的最簡單方法:
>>> for elem in tree.iter():... print(elem.tag, elem.attrib)...collection {'shelf': 'New Arrivals'}class {'className': '1班'}code {}number {}teacher {}class {'className': '2班'}code {}number {}teacher {}class {'className': '3班'}code {}number {}teacher {}
7)對樹進(jìn)行任意遍歷——遍歷所有元素,iter方法可以接受tag名稱,然后遍歷所有具備所提供tag的元素:
>>> for elem in tree.iter(tag='teacher'):... print(elem.tag, elem.text)...teacher 小白 teacher 小紅 teacher 小黑
8)支持通過XPath查找元素
>>> for elem in tree.iterfind('class/teacher'):... print(elem.tag, elem.text)...teacher 小白 teacher 小紅 teacher 小黑
9)查找所有具備某個(gè)name屬性的className元素:
>>> for elem in tree.iterfind('class[@className="1班"]'):... print(elem.tag, elem.attrib)...class {'className': '1班'}
10)完整解析代碼
import xml.etree.ElementTree as ET tree = ET.ElementTree(file='1.xml')print(type(tree))root = tree.getroot() # root是根元素print(type(root))print(root.tag)for index, child in enumerate(root): print("第%s個(gè)%s元素,屬性:%s" % (index, child.tag, child.attrib)) for i, child_child in enumerate(child): print("標(biāo)簽:%s,內(nèi)容:%s" % (child_child.tag, child_child.text))
輸出結(jié)果:
<class 'xml.etree.ElementTree.ElementTree'><class 'xml.etree.ElementTree.Element'>collection 第0個(gè)class元素,屬性:{'className': '1班'}標(biāo)簽:code,內(nèi)容:2022001標(biāo)簽:number,內(nèi)容:10標(biāo)簽:teacher,內(nèi)容:小白 第1個(gè)class元素,屬性:{'className': '2班'}標(biāo)簽:code,內(nèi)容:2022002標(biāo)簽:number,內(nèi)容:20標(biāo)簽:teacher,內(nèi)容:小紅 第2個(gè)class元素,屬性:{'className': '3班'}標(biāo)簽:code,內(nèi)容:2022003標(biāo)簽:number,內(nèi)容:30標(biāo)簽:teacher,內(nèi)容:小黑
DOM (Document Object Model)將XML文檔作為一棵樹狀結(jié)構(gòu)進(jìn)行分析,獲取節(jié)點(diǎn)的內(nèi)容以及相關(guān)屬性,或是新增、刪除和修改節(jié)點(diǎn)的內(nèi)容。XML解析器在加載XML文件以后,DQM模式將XML文件的元素視為一個(gè)樹狀結(jié)構(gòu)的節(jié)點(diǎn),一次性讀入內(nèi)存。
解析代碼:
from xml.dom.minidom import parse# 讀取文件dom = parse('1.xml')# 獲取文檔元素對象elem = dom.documentElement# 獲取 classclass_list_obj = elem.getElementsByTagName('class')print(class_list_obj)print(type(class_list_obj))for class_element in class_list_obj: # 獲取標(biāo)簽中內(nèi)容 code = class_element.getElementsByTagName('code')[0].childNodes[0].nodeValue number = class_element.getElementsByTagName('number')[0].childNodes[0].nodeValue teacher = class_element.getElementsByTagName('teacher')[0].childNodes[0].nodeValue print('code:', code, ', number:', number, ', teacher:', teacher)
輸出結(jié)果:
[<DOM Element: class at 0x20141bc5c10>, <DOM Element: class at 0x20141bdf940>, <DOM Element: class at 0x20141bdfb80>]<class 'xml.dom.minicompat.NodeList'>code: 2022001 , number: 10 , teacher: 小白 code: 2022002 , number: 20 , teacher: 小紅 code: 2022003 , number: 30 , teacher: 小黑
doc.writexml()
:生成xml文檔,將創(chuàng)建的存在于內(nèi)存中的xml文檔寫入本地硬盤中,這時(shí)才能看到新建的xml文檔
語法格式:writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)
參數(shù)說明:
file
:要保存為的文件對象名
indent
:根節(jié)點(diǎn)的縮進(jìn)方式
allindent
:子節(jié)點(diǎn)的縮進(jìn)方式
newl
:針對新行,指明換行方式
encoding
:保存文件的編碼方式
案例代碼:
import xml.dom.minidom # 1、在內(nèi)存中創(chuàng)建一個(gè)空的文檔doc = xml.dom.minidom.Document() # 2、創(chuàng)建根元素root = doc.createElement('collection ')# print('添加的xml標(biāo)簽為:',root.tagName) # 3、設(shè)置根元素的屬性root.setAttribute('type', 'New Arrivals') # 4、將根節(jié)點(diǎn)添加到文檔對象中doc.appendChild(root) # 5、創(chuàng)建子元素book = doc.createElement('book') # 6、添加注釋book.appendChild(doc.createComment('這是一條注釋')) # 7、設(shè)置子元素的屬性book.setAttribute('語言', 'java') # 8、子元素中嵌套子元素,并添加文本節(jié)點(diǎn)name = doc.createElement('name')name.appendChild(doc.createTextNode('java基礎(chǔ)'))price = doc.createElement('價(jià)格')price.appendChild(doc.createTextNode('99元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余100本'))# 9、將子元素添加到boot節(jié)點(diǎn)中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 10、將book節(jié)點(diǎn)添加到root根元素中root.appendChild(book)# 創(chuàng)建子元素book = doc.createElement('book')# 設(shè)置子元素的屬性book.setAttribute('語言', 'python')# 子元素中嵌套子元素,并添加文本節(jié)點(diǎn)name = doc.createElement('name')name.appendChild(doc.createTextNode('python基礎(chǔ)'))price = doc.createElement('價(jià)格')price.appendChild(doc.createTextNode('50元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余20本'))# 將子元素添加到boot節(jié)點(diǎn)中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 將book節(jié)點(diǎn)添加到root根元素中root.appendChild(book)print(root.toxml())fp = open('./書籍.xml', 'w', encoding='utf-8') # 需要指定utf-8的文件編碼格式,不然notepad中顯示十六進(jìn)制doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding='utf-8')fp.close()
生成書籍.xml
文件:
向xml中插入新的子元素
案例代碼:
import xml.dom.minidomfrom xml.dom.minidom import parse# 對book.xml新增一個(gè)子元素english,并刪除math元素xml_file = './書籍.xml'# 拿到根節(jié)點(diǎn)domTree = parse(xml_file)rootNode = domTree.documentElement# rootNode.removeChild(rootNode.getElementsByTagName('book')[0])# print(rootNode.toxml())# 在內(nèi)存中創(chuàng)建一個(gè)空的文檔doc = xml.dom.minidom.Document()book = doc.createElement('book')book.setAttribute('語言', 'c++')# 子元素中嵌套子元素,并添加文本節(jié)點(diǎn)name = doc.createElement('name')name.appendChild(doc.createTextNode('c++基礎(chǔ)'))price = doc.createElement('價(jià)格')price.appendChild(doc.createTextNode('200元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余300本'))# 將子元素添加到boot節(jié)點(diǎn)中book.appendChild(name)book.appendChild(price)book.appendChild(number)math_book = rootNode.getElementsByTagName('book')[0]# insertBefore方法 父節(jié)點(diǎn).insertBefore(新節(jié)點(diǎn),父節(jié)點(diǎn)中的子節(jié)點(diǎn))rootNode.insertBefore(book, math_book)# appendChild將新產(chǎn)生的子元素在最后插入rootNode.appendChild(book)print(rootNode.toxml())with open(xml_file, 'w', encoding='utf-8') as fh: domTree.writexml(fh, indent='', addindent='\t', newl='', encoding='utf-8')
輸出結(jié)果:添加了新節(jié)點(diǎn)
記錄工作中常用的一個(gè)小技巧
cmd控制臺安裝第三方模塊:
pip install xmltodict
新建一個(gè)1.xml
文件:
<note date="23/04/2022"> <to>tom</to> <from>mary</from> <msg>love</msg></note>
轉(zhuǎn)換代碼實(shí)現(xiàn):
import jsonimport xmltodictdef xml_to_json(xml_str): """parse是的xml解析器,參數(shù)需要 :param xml_str: xml字符串 :return: json字符串 """ xml_parse = xmltodict.parse(xml_str) # json庫dumps()是將dict轉(zhuǎn)化成json格式,loads()是將json轉(zhuǎn)化成dict格式。 # dumps()方法的ident=1,格式化json json_str = json.dumps(xml_parse, indent=1) return json_str XML_PATH = './1.xml' # xml文件的路徑with open(XML_PATH, 'r') as f: xmlfile = f.read() with open(XML_PATH[:-3] + 'json', 'w') as newfile: newfile.write(xml_to_json(xmlfile))
輸出結(jié)果(生成json文件):
新建test.json
文件:
{ "student": { "course": { "name": "math", "score": "90" }, "info": { "sex": "male", "name": "name" }, "stid": "10213" }}
轉(zhuǎn)換代碼實(shí)現(xiàn):
import xmltodictimport jsondef json_to_xml(python_dict): """xmltodict庫的unparse()json轉(zhuǎn)xml :param python_dict: python的字典對象 :return: xml字符串 """ xml_str = xmltodict.unparse(python_dict) return xml_str JSON_PATH = './test.json' # json文件的路徑with open(JSON_PATH, 'r') as f: jsonfile = f.read() python_dict = json.loads(jsonfile) # 將json字符串轉(zhuǎn)換為python字典對象 with open(JSON_PATH[:-4] + 'xml', 'w') as newfile: newfile.write(json_to_xml(python_dict))
輸出結(jié)果(生成xml文件):
到此,關(guān)于“Python如何操作XML文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。