一起來分析Python怎麼操作XML文件

WBOY
發布: 2022-05-05 21:13:52
轉載
3222 人瀏覽過

本篇文章為大家帶來了關於python的相關知識,其中主要介紹了Python怎麼操作XML檔案的相關問題,包括了XML基礎概述,Python解析XML檔、寫入XML文件、更新XML文件等內容,以下一起來看一下,希望對大家有幫助。

一起來分析Python怎麼操作XML文件

推薦學習:python影片教學

#一、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=&#39; "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>
	<class>
	   <code>2022001</code>
	   <number>10</number>
	   <teacher>小白</teacher>
	</class>
	<class>
	   <code>2022002</code>
	   <number>20</number>
	   <teacher>小红</teacher>
	</class>
	<class>
	   <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.getiterator(tag=None)
類別方法 說明
#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(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></element>
登入後複製

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><class>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,内容:小黑</class></class>
登入後複製

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>, <dom>, <dom>]<class>code: 2022001 , number: 10 , teacher: 小白
code: 2022002 , number: 20 , teacher: 小红
code: 2022003 , number: 30 , teacher: 小黑</class></dom></dom></dom>
登入後複製

三、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>
	<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视频教程

以上是一起來分析Python怎麼操作XML文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板