中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Python如何操作XML文件

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

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

Python如何操作XML文件

一、XML基礎概述

1、XML是什么?

XML(Extensible Markup Language):即可擴展標記語言,xml是互聯網數據傳輸的重要工具,它可以跨越互聯網任何的平臺,不受編程語言和的限制,可以說它是一個擁 有互聯網最高級別通行證的數據攜帶者。xml是當前處理結構化文檔信息中相當給力的技術,xml有 助于在服務器之間穿梭結構化數據,這使得開發人員更加得心應手的控制數據的存儲和傳輸。

Xml用于標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是-種允許用戶對自己的標記語言進行定義的源語 言。Xml是標準通用標記語言(SGML) 的子集,非常適合Web傳輸。XML提供統-的方法來描述和交換獨立于應用程序或供應商的結構化數據。

2、XML的特點及作用

特點

  • xm|與編程語言的開發平臺都無關

  • 實現不同系統之間的數據交互。

作用

  • 配置應用程序和網站;

  • 數據交互;

  • Ajax基石。

3、XML文件格式

  • 聲明

  • 根元素

  • 子元素

  • 屬性

  • 命名空間

  • 限定名

與HTML類似,XML是另一種將數據存儲在標記之間的標記語言。它是人類可讀和可擴展的;也就是說,我們可以自由地定義自己的標記。XML中的屬性、元素和標記與HTML中的類似。XML文件可以有聲明,也可以沒有聲明。但是,如果它有一個聲明,那么它必須是XML文件的第一行。如:

<?xml version="1.0” encoding=' "UTF-8" standalone=" no”?>

這個聲明語句有三部分:版本、編碼和獨立性。版本說明正在使用的XML標準的版本; Encoding 表示在此文件中使用的字符編碼類型; Standalone 告訴解析器是否要外部信息來解釋XML文件的內容。

XML文件可以表示為稱為: XML 樹。這個XML樹從根元素(父元素)開始。這個根元素進一步分支到子元素。 XML文件的每個元素都是XML樹中的一個節點。那些沒有子節點的元素是葉節點。下圖清楚地區分了原始XML文件和XML文件的樹表示:
Python如何操作XML文件
Python如何操作XML文件
Python如何操作XML文件

二、Python解析XML文件

新建一個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模塊提供了一個輕量級、Pythonic的API,同時還有一個高效的C語言實現,即xml.etree.cElementTree。與DOM相比,ET的速度更快,API使用更直接、方便。與SAX相比,ET.iterparse函數同樣提供了按需解析的功能,不會一次性在內存中讀入整個文檔。ET的性能與SAX模塊大致相仿,但是它的API更加高層次,用戶使用起來更加便捷。

Element對象方法:

類方法說明
Element.iter(tag=None)遍歷該Element所有后代,也可以指定tag進行遍歷尋找。
Element.iterfind(path, namespaces=None)根據tag或path查找所有的后代。
Element.itertext()遍歷所有后代并返回text值。
Element.findall(path)查找當前元素下tag或path能夠匹配的直系節點
Element.findtext(path, default=None, namespaces=None)尋找第一個匹配子元素,返回其text值。匹配對象可以為tag或path。
Element.find(path)查找當前元素下tag或path能夠匹配的首個直系節點。
Element.text獲取當前元素的text值。
Element.get(key, default=None)獲取元素指定key對應的屬性值,如果沒有該屬性,則返回default值。
Element.keys()返回元素屬性名稱列表
Element.items()返回(name,value)列表
Element.getchildren()
Element.getiterator(tag=None)
Element.getiterator(self, tag=None)

屬性方法

方法名說明
Element.tag節點名(tag)(str)
Element.attrib屬性(attributes)(dict)
Element.text文本(text)(str)
Element.tail附加文本(tail) (str)
Element[:]子節點列表(list)

1)接下來,我們加載這個文檔,并進行解析:

>>> import xml.etree.ElementTree as ET>>> tree = ET.ElementTree(file='1.xml')

2) 然后,我們獲取根元素(root element):

>>> tree.getroot()<Element 'collection' at 0x000001FCC9BBFA90>

3)根元素(root)是一個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) 查找需要的元素

從上面的示例中,可以明顯發現我們能夠通過簡單的遞歸方法(對每一個元素,遞歸式訪問其所有子元素)獲取樹中的所有元素。但是,由于這是十分常見的工作,ET提供了一些簡便的實現方法。

Element對象有一個iter方法,可以對某個元素對象之下所有的子元素進行深度優先遍歷(DFS)。ElementTree對象同樣也有這個方法。下面是查找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)對樹進行任意遍歷——遍歷所有元素,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)查找所有具備某個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個%s元素,屬性:%s" % (index, child.tag, child.attrib))
    for i, child_child in enumerate(child):
        print("標簽:%s,內容:%s" % (child_child.tag, child_child.text))

輸出結果:

<class 'xml.etree.ElementTree.ElementTree'><class 'xml.etree.ElementTree.Element'>collection
第0個class元素,屬性:{'className': '1班'}標簽:code,內容:2022001標簽:number,內容:10標簽:teacher,內容:小白
第1個class元素,屬性:{'className': '2班'}標簽:code,內容:2022002標簽:number,內容:20標簽:teacher,內容:小紅
第2個class元素,屬性:{'className': '3班'}標簽:code,內容:2022003標簽:number,內容:30標簽:teacher,內容:小黑

2、DOM 方式

DOM (Document Object Model)將XML文檔作為一棵樹狀結構進行分析,獲取節點的內容以及相關屬性,或是新增、刪除和修改節點的內容。XML解析器在加載XML文件以后,DQM模式將XML文件的元素視為一個樹狀結構的節點,一次性讀入內存。

解析代碼:

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:
    # 獲取標簽中內容
    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)

輸出結果:

[<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文檔,將創建的存在于內存中的xml文檔寫入本地硬盤中,這時才能看到新建的xml文檔

語法格式writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)

參數說明

  • file:要保存為的文件對象名

  • indent:根節點的縮進方式

  • allindent:子節點的縮進方式

  • newl:針對新行,指明換行方式

  • encoding:保存文件的編碼方式

案例代碼:

import xml.dom.minidom
# 1、在內存中創建一個空的文檔doc = xml.dom.minidom.Document()
# 2、創建根元素root = doc.createElement('collection ')# print('添加的xml標簽為:',root.tagName)
# 3、設置根元素的屬性root.setAttribute('type', 'New Arrivals')
# 4、將根節點添加到文檔對象中doc.appendChild(root)
# 5、創建子元素book = doc.createElement('book')
# 6、添加注釋book.appendChild(doc.createComment('這是一條注釋'))
# 7、設置子元素的屬性book.setAttribute('語言', 'java')
# 8、子元素中嵌套子元素,并添加文本節點name = doc.createElement('name')name.appendChild(doc.createTextNode('java基礎'))price = doc.createElement('價格')price.appendChild(doc.createTextNode('99元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余100本'))# 9、將子元素添加到boot節點中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 10、將book節點添加到root根元素中root.appendChild(book)# 創建子元素book = doc.createElement('book')# 設置子元素的屬性book.setAttribute('語言', 'python')# 子元素中嵌套子元素,并添加文本節點name = doc.createElement('name')name.appendChild(doc.createTextNode('python基礎'))price = doc.createElement('價格')price.appendChild(doc.createTextNode('50元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余20本'))#  將子元素添加到boot節點中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 將book節點添加到root根元素中root.appendChild(book)print(root.toxml())fp = open('./書籍.xml', 'w', encoding='utf-8')  # 需要指定utf-8的文件編碼格式,不然notepad中顯示十六進制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新增一個子元素english,并刪除math元素xml_file = './書籍.xml'# 拿到根節點domTree = parse(xml_file)rootNode = domTree.documentElement# rootNode.removeChild(rootNode.getElementsByTagName('book')[0])# print(rootNode.toxml())# 在內存中創建一個空的文檔doc = xml.dom.minidom.Document()book = doc.createElement('book')book.setAttribute('語言', 'c++')# 子元素中嵌套子元素,并添加文本節點name = doc.createElement('name')name.appendChild(doc.createTextNode('c++基礎'))price = doc.createElement('價格')price.appendChild(doc.createTextNode('200元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余300本'))#  將子元素添加到boot節點中book.appendChild(name)book.appendChild(price)book.appendChild(number)math_book = rootNode.getElementsByTagName('book')[0]# insertBefore方法  父節點.insertBefore(新節點,父節點中的子節點)rootNode.insertBefore(book, math_book)# appendChild將新產生的子元素在最后插入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')

輸出結果:添加了新節點
Python如何操作XML文件

五、XML文件和JSON文件互轉

記錄工作中常用的一個小技巧

cmd控制臺安裝第三方模塊

pip install xmltodict

1、XML文件轉為JSON文件

新建一個1.xml文件:

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

Python如何操作XML文件

轉換代碼實現

import jsonimport xmltodictdef xml_to_json(xml_str):
    """parse是的xml解析器,參數需要

    :param xml_str: xml字符串
    :return: json字符串
    """
    xml_parse = xmltodict.parse(xml_str)
    # json庫dumps()是將dict轉化成json格式,loads()是將json轉化成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))

輸出結果(生成json文件):
Python如何操作XML文件

2、JSON文件轉換為XML文件

新建test.json文件:

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

Python如何操作XML文件

轉換代碼實現:

import xmltodictimport jsondef json_to_xml(python_dict):
    """xmltodict庫的unparse()json轉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字符串轉換為python字典對象
    with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
        newfile.write(json_to_xml(python_dict))

輸出結果(生成xml文件):
Python如何操作XML文件

到此,關于“Python如何操作XML文件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

许昌县| 寿阳县| 扶风县| 博乐市| 辽源市| 西城区| 新野县| 翁牛特旗| 阿尔山市| 东方市| 洛宁县| 枣强县| 南川市| 阿图什市| 方城县| 大英县| 盐山县| 宁陵县| 沧州市| 九江市| 永平县| 张掖市| 房产| 东光县| 苏尼特右旗| 二连浩特市| 开化县| 海林市| 密云县| 类乌齐县| 治多县| 福泉市| 岳阳市| 灌南县| 涞水县| 德阳市| 义乌市| 乌兰县| 洛阳市| 三江| 枝江市|