zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    js中的原生Ajax和JQuery中的Ajax
    this的用法
    static的特性
    时政20180807
    java compiler没有1.8怎么办
    Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet Unknown Faceted Project Problem (Java Version Mismatch)
    分词器
    [数算]有一个工程甲、乙、丙单独做,分别要48天、72天、96天完成
    一点感想
    解析Excel文件 Apache POI框架使用
  • 原文地址:https://www.cnblogs.com/lhy-522/p/13021490.html
Copyright © 2011-2022 走看看