溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何操作XML文件

發(fā)布時(shí)間:2022-05-10 15:48:56 來源:億速云 閱讀:170 作者:iii 欄目:編程語言

這篇文章主要介紹“Python如何操作XML文件”,在日常操作中,相信很多人在Python如何操作XML文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何操作XML文件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

Python如何操作XML文件

一、XML基礎(chǔ)概述

1、XML是什么?

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ù)。

2、XML的特點(diǎn)及作用

特點(diǎn)

  • xm|與編程語言的開發(fā)平臺都無關(guān)

  • 實(shí)現(xiàn)不同系統(tǒng)之間的數(shù)據(jù)交互。

作用

  • 配置應(yīng)用程序和網(wǎng)站;

  • 數(shù)據(jù)交互;

  • Ajax基石。

3、XML文件格式

  • 聲明

  • 根元素

  • 子元素

  • 屬性

  • 命名空間

  • 限定名

與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文件的樹表示:
Python如何操作XML文件
Python如何操作XML文件
Python如何操作XML文件

二、Python解析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>

1、ElementTree 方式

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)容:小黑

2、DOM 方式

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: 小黑

三、Python寫入XML文件

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文件:

Python如何操作XML文件

四、Python更新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)
Python如何操作XML文件

五、XML文件和JSON文件互轉(zhuǎn)

記錄工作中常用的一個(gè)小技巧

cmd控制臺安裝第三方模塊

pip install xmltodict

1、XML文件轉(zhuǎn)為JSON文件

新建一個(gè)1.xml文件:

<note date="23/04/2022">
	<to>tom</to>
	<from>mary</from>
	<msg>love</msg></note>

Python如何操作XML文件

轉(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文件):
Python如何操作XML文件

2、JSON文件轉(zhuǎn)換為XML文件

新建test.json文件:

{
  "student": {
    "course": {
      "name": "math",
      "score": "90"
    },
    "info": {
      "sex": "male",
      "name": "name"
    },
    "stid": "10213"
  }}

Python如何操作XML文件

轉(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文件):
Python如何操作XML文件

到此,關(guān)于“Python如何操作XML文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI