• Python常用内置模块之xml模块


    XML模块  

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml,XML文件格式如下:

     1 <data>
     2     <country name="Liechtenstein">
     3         <rank updated="yes">2</rank>
     4         <year>2023</year>
     5         <gdppc>141100</gdppc>
     6         <neighbor direction="E" name="Austria" />
     7         <neighbor direction="W" name="Switzerland" />
     8     </country>
     9     <country name="Singapore">
    10         <rank updated="yes">5</rank>
    11         <year>2026</year>
    12         <gdppc>59900</gdppc>
    13         <neighbor direction="N" name="Malaysia" />
    14     </country>
    15     <country name="Panama">
    16         <rank updated="yes">69</rank>
    17         <year>2026</year>
    18         <gdppc>13600</gdppc>
    19         <neighbor direction="W" name="Costa Rica" />
    20         <neighbor direction="E" name="Colombia" />
    21     </country>
    22 </data>
    View Code

    1、解析XML两种方法

    (1)利用ElementTree.XML将字符串解析成xml对象

    1 from xml.etree import ElementTree as ET
    2  
    3 # 打开文件,读取XML内容
    4 str_xml = open('xo.xml', 'r').read()
    5  
    6 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
    7 root = ET.XML(str_xml)
    View Code

    (2)利用ElementTree.parse将文件直接解析成xml对象  

    1 from xml.etree import ElementTree as ET
    2  
    3 # 直接解析xml文件
    4 tree = ET.parse("xo.xml")
    5  
    6 # 获取xml文件的根节点
    7 root = tree.getroot()
    View Code

    2、操作XML  

    XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:

     View Code

    由于 每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),so   可以利用以上方法进行操作xml文件。

    (1)遍历XML文档的所有内容

     1 from xml.etree import ElementTree as ET
     2  
     3 ############ 解析方式一 ############
     4 """
     5 # 打开文件,读取XML内容
     6 str_xml = open('xo.xml', 'r').read()
     7  
     8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
     9 root = ET.XML(str_xml)
    10 """
    11 ############ 解析方式二 ############
    12  
    13 # 直接解析xml文件
    14 tree = ET.parse("xo.xml")
    15  
    16 # 获取xml文件的根节点
    17 root = tree.getroot()
    18  
    19  
    20 ### 操作
    21  
    22 # 顶层标签
    23 print(root.tag)
    24  
    25  
    26 # 遍历XML文档的第二层
    27 for child in root:
    28     # 第二层节点的标签名称和标签属性
    29     print(child.tag, child.attrib)
    30     # 遍历XML文档的第三层
    31     for i in child:
    32         # 第二层节点的标签名称和内容
    33         print(i.tag,i.text)
    View Code

    (2)遍历XML中指定的节点 

     1 from xml.etree import ElementTree as ET
     2  
     3 ############ 解析方式一 ############
     4 """
     5 # 打开文件,读取XML内容
     6 str_xml = open('xo.xml', 'r').read()
     7  
     8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
     9 root = ET.XML(str_xml)
    10 """
    11 ############ 解析方式二 ############
    12  
    13 # 直接解析xml文件
    14 tree = ET.parse("xo.xml")
    15  
    16 # 获取xml文件的根节点
    17 root = tree.getroot()
    18  
    19  
    20 ### 操作
    21  
    22 # 顶层标签
    23 print(root.tag)
    24  
    25  
    26 # 遍历XML中所有的year节点
    27 for node in root.iter('year'):
    28     # 节点的标签名称和内容
    29     print(node.tag, node.text)
    View Code

    (3)修改节点内容

    由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。

    解析字符串方式,修改,保存

     1 from xml.etree import ElementTree as ET
     2  
     3 ############ 解析方式一 ############
     4  
     5 # 打开文件,读取XML内容
     6 str_xml = open('xo.xml', 'r').read()
     7  
     8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
     9 root = ET.XML(str_xml)
    10  
    11 ############ 操作 ############
    12  
    13 # 顶层标签
    14 print(root.tag)
    15  
    16 # 循环所有的year节点
    17 for node in root.iter('year'):
    18     # 将year节点中的内容自增一
    19     new_year = int(node.text) + 1
    20     node.text = str(new_year)
    21  
    22     # 设置属性
    23     node.set('name', 'alex')
    24     node.set('age', '18')
    25     # 删除属性
    26     del node.attrib['name']
    27  
    28  
    29 ############ 保存文件 ############
    30 tree = ET.ElementTree(root)
    31 tree.write("newnew.xml", encoding='utf-8')
    View Code

    解析文件方式,修改,保存

     1 from xml.etree import ElementTree as ET
     2  
     3 ############ 解析方式二 ############
     4  
     5 # 直接解析xml文件
     6 tree = ET.parse("xo.xml")
     7  
     8 # 获取xml文件的根节点
     9 root = tree.getroot()
    10  
    11 ############ 操作 ############
    12  
    13 # 顶层标签
    14 print(root.tag)
    15  
    16 # 循环所有的year节点
    17 for node in root.iter('year'):
    18     # 将year节点中的内容自增一
    19     new_year = int(node.text) + 1
    20     node.text = str(new_year)
    21  
    22     # 设置属性
    23     node.set('name', 'alex')
    24     node.set('age', '18')
    25     # 删除属性
    26     del node.attrib['name']
    27  
    28  
    29 ############ 保存文件 ############
    30 tree.write("newnew.xml", encoding='utf-8')
    31  
    32 解析文件方式,修改,保存
    View Code

    (4)删除节点  

    解析字符串方式打开,删除,保存

     1 from xml.etree import ElementTree as ET
     2  
     3 ############ 解析字符串方式打开 ############
     4  
     5 # 打开文件,读取XML内容
     6 str_xml = open('xo.xml', 'r').read()
     7  
     8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
     9 root = ET.XML(str_xml)
    10  
    11 ############ 操作 ############
    12  
    13 # 顶层标签
    14 print(root.tag)
    15  
    16 # 遍历data下的所有country节点
    17 for country in root.findall('country'):
    18     # 获取每一个country节点下rank节点的内容
    19     rank = int(country.find('rank').text)
    20  
    21     if rank > 50:
    22         # 删除指定country节点
    23         root.remove(country)
    24  
    25 ############ 保存文件 ############
    26 tree = ET.ElementTree(root)
    27 tree.write("newnew.xml", encoding='utf-8')
    View Code

    解析文件方式打开,删除,保存

     1 from xml.etree import ElementTree as ET
     2  
     3 ############ 解析文件方式 ############
     4  
     5 # 直接解析xml文件
     6 tree = ET.parse("xo.xml")
     7  
     8 # 获取xml文件的根节点
     9 root = tree.getroot()
    10  
    11 ############ 操作 ############
    12  
    13 # 顶层标签
    14 print(root.tag)
    15  
    16 # 遍历data下的所有country节点
    17 for country in root.findall('country'):
    18     # 获取每一个country节点下rank节点的内容
    19     rank = int(country.find('rank').text)
    20  
    21     if rank > 50:
    22         # 删除指定country节点
    23         root.remove(country)
    24  
    25 ############ 保存文件 ############
    26 tree.write("newnew.xml", encoding='utf-8')
    View Code

    3、创建XML文档

    创建方式(一)

     1 from xml.etree import ElementTree as ET
     2  
     3  
     4 # 创建根节点
     5 root = ET.Element("famliy")
     6  
     7  
     8 # 创建节点大儿子
     9 son1 = ET.Element('son', {'name': '儿1'})
    10 # 创建小儿子
    11 son2 = ET.Element('son', {"name": '儿2'})
    12  
    13 # 在大儿子中创建两个孙子
    14 grandson1 = ET.Element('grandson', {'name': '儿11'})
    15 grandson2 = ET.Element('grandson', {'name': '儿12'})
    16 son1.append(grandson1)
    17 son1.append(grandson2)
    18  
    19  
    20 # 把儿子添加到根节点中
    21 root.append(son1)
    22 root.append(son1)
    23  
    24 tree = ET.ElementTree(root)
    25 tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    View Code

    创建方式(一)  

     1 from xml.etree import ElementTree as ET
     2  
     3 # 创建根节点
     4 root = ET.Element("famliy")
     5  
     6  
     7 # 创建大儿子
     8 # son1 = ET.Element('son', {'name': '儿1'})
     9 son1 = root.makeelement('son', {'name': '儿1'})
    10 # 创建小儿子
    11 # son2 = ET.Element('son', {"name": '儿2'})
    12 son2 = root.makeelement('son', {"name": '儿2'})
    13  
    14 # 在大儿子中创建两个孙子
    15 # grandson1 = ET.Element('grandson', {'name': '儿11'})
    16 grandson1 = son1.makeelement('grandson', {'name': '儿11'})
    17 # grandson2 = ET.Element('grandson', {'name': '儿12'})
    18 grandson2 = son1.makeelement('grandson', {'name': '儿12'})
    19  
    20 son1.append(grandson1)
    21 son1.append(grandson2)
    22  
    23  
    24 # 把儿子添加到根节点中
    25 root.append(son1)
    26 root.append(son1)
    27  
    28 tree = ET.ElementTree(root)
    29 tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    View Code

    创建方式(一)

     1 from xml.etree import ElementTree as ET
     2  
     3  
     4 # 创建根节点
     5 root = ET.Element("famliy")
     6  
     7  
     8 # 创建节点大儿子
     9 son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
    10 # 创建小儿子
    11 son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
    12  
    13 # 在大儿子中创建一个孙子
    14 grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
    15 grandson1.text = '孙子'
    16  
    17  
    18 et = ET.ElementTree(root)  #生成文档对象
    19 et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
    View Code

    由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:

     1 from xml.etree import ElementTree as ET
     2 from xml.dom import minidom
     3  
     4  
     5 def prettify(elem):
     6     """将节点转换成字符串,并添加缩进。
     7     """
     8     rough_string = ET.tostring(elem, 'utf-8')
     9     reparsed = minidom.parseString(rough_string)
    10     return reparsed.toprettyxml(indent="	")
    11  
    12 # 创建根节点
    13 root = ET.Element("famliy")
    14  
    15  
    16 # 创建大儿子
    17 # son1 = ET.Element('son', {'name': '儿1'})
    18 son1 = root.makeelement('son', {'name': '儿1'})
    19 # 创建小儿子
    20 # son2 = ET.Element('son', {"name": '儿2'})
    21 son2 = root.makeelement('son', {"name": '儿2'})
    22  
    23 # 在大儿子中创建两个孙子
    24 # grandson1 = ET.Element('grandson', {'name': '儿11'})
    25 grandson1 = son1.makeelement('grandson', {'name': '儿11'})
    26 # grandson2 = ET.Element('grandson', {'name': '儿12'})
    27 grandson2 = son1.makeelement('grandson', {'name': '儿12'})
    28  
    29 son1.append(grandson1)
    30 son1.append(grandson2)
    31  
    32  
    33 # 把儿子添加到根节点中
    34 root.append(son1)
    35 root.append(son1)
    36  
    37  
    38 raw_str = prettify(root)
    39  
    40 f = open("xxxoo.xml",'w',encoding='utf-8')
    41 f.write(raw_str)
    42 f.close()
    View Code

    4、命名空间

    详细介绍,猛击这里

     1 from xml.etree import ElementTree as ET
     2  
     3 ET.register_namespace('com',"http://www.company.com") #some name
     4  
     5 # build a tree structure
     6 root = ET.Element("{http://www.company.com}STUFF")
     7 body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"})
     8 body.text = "STUFF EVERYWHERE!"
     9  
    10 # wrap it in an ElementTree instance, and save as XML
    11 tree = ET.ElementTree(root)
    12  
    13 tree.write("page.xml",
    14            xml_declaration=True,
    15            encoding='utf-8',
    16            method="xml")
    View Code
  • 相关阅读:
    Ansible配置管理Windows主机
    Docker中安装rabbitmq并启用插件
    解决Ubuntu不能直接root用户连接ssh
    Error in invoking target ‘agent nmhs’ of makefile ‘/home/dong/tools/oracle11g/product/11.2.0/dbhome_1/sysman/lib/ins_emagent.mk’
    Ubuntu16.04安装sqlserver-快速入门
    记录一次归档日志爆满事件
    Linux下Mysql忘记root密码
    Ubuntu16.04安装Rabbitmq
    Oracle查看执行计划
    Ubuntu16.04随笔
  • 原文地址:https://www.cnblogs.com/lhy-522/p/13021490.html
Copyright © 2020-2023  润新知