zoukankan      html  css  js  c++  java
  • 模块讲解----XML模块

    XML实现不同语言或者程序之间进行数据交换的协议
    XML文件格式如下:

    1、浏览器返回的字符串格式类型有:
      a、HTML
      b、Json
      c、XML

    2、XML格式如下:

     1 <data>  #表示跟节点的开头
     2     <country name="CTO" TEL='13511122233' >
     3         <zongjian name='zhangsan'  age='19'>
     4             <jingli name='wangwu'  age='22'>
     5                 .....(其他属性)
     6             </jingli>
     7         </zongjian>
     8         <zongjian name='lisi' age='19'>2023</zongjian>
     9     </country>
    10     <country name="CEO">
    11         <rank updated="yes">5</rank>
    12         <year>2026</year>
    13         <gdppc>59900</gdppc>
    14         <neighbor direction="N" name="Malaysia" />
    15     </country>
    16     <country name="COO">
    17         <rank updated="yes">69</rank>
    18         <year>2026</year>
    19         <gdppc>13600</gdppc>
    20         <neighbor direction="W" name="Costa Rica" />
    21         <neighbor direction="E" name="Colombia" />
    22     </country>
    23 </data> #表示根节点的结尾

    3、要点:

    1 XML的格式就相当于字典嵌套字典的形式;
    2 每一个节点都是一个Element对象节点里面可以嵌套节点;
    3 每一个字典都是一个dict的对象,跟字典里嵌套字典的方式一样;
    4 在XML的操作方法中,使用element中的每一个节点。

    python中处理XML的两种格式方法

    1 1、字符串类型;(可以用作有层次逻辑的页面展示)
    2 例如:列车时刻表
    3 http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=
    4 
    5 2、文本文件类型:(程序的配置文件)
    6 数据库的类型:(mysql、oracle)
    7 连接数据库IP:
    8 端口:
    9 连接池最多为多少:

    解析XML

    XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
     1 1、字符串解析:
     2 (利用ElementTree.XML将字符串解析成xml对象)
     3 from xml.etree import ElementTree as ET
     4  5 # 打开文件,读取XML内容
     6 str_xml = open('xo.xml', 'r').read()      #这种方法也可以利用在requests请求后,返回来的xml结果集
     7  8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
     9 root = ET.XML(str_xml)
    10 注:保存方法分2步(a、使ElementTree方法将内存的root保存一个变量里;b、然后在将变量写入到一个新的文件里)
    11 
    12 
    13 
    14 2、文本文件直接解析:
    15 (利用ElementTree.parse将文件直接解析成xml对象)
    16 from xml.etree import ElementTree as ET
    17 18 # 直接解析xml文件
    19 tree = ET.parse("xo.xml")
    20 21 # 获取xml文件的根节点
    22 root = tree.getroot()
    23 注:用解析XML文件的变量,直接写入到新文件中。
    24 
    25 由于每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),所以可以利用以上方法进行操作xml文件。

    操作XML

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

    2、遍历XML中指定的节点:

     1 from xml.etree import ElementTree as ET
     2 
     3 ############ 解析方式一 ############
     4 """
     5 #字符串的方式解析
     6 # 打开文件,读取XML内容
     7 str_xml = open('xo.xml', 'r').read()
     8 
     9 # 将字符串解析成xml特殊对象,root代指xml文件的根节点
    10 root = ET.XML(str_xml)
    11 """
    12     
    13     
    14 ############ 解析方式二 ############
    15 # 遍历XML文档的第二层
    16 # 直接解析xml文件
    17 tree = ET.parse("xo.xml")
    18 
    19 # 获取xml文件的根节点
    20 root = tree.getroot()
    21 
    22 
    23 ### 操作
    24 
    25 # 顶层标签
    26 print(root.tag)
    27 
    28 
    29 # 遍历XML中所有的year节点
    30 for node in root.iter('year'):
    31     # 节点的标签名称和内容
    32     print(node.tag, node.text)
    (二)、修改并保存:
    由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。
    1、字符串格式:
     1 #导入文件模块:
     2 from xml.etree import ElementTree as ET
     3 
     4 str_xml = open('ox.xml','r').read()  #打开文件,读取XML内容
     5 root = ET.XML(str_xml)                #将字符串解析成xml特殊对象,root代指xml文件的跟节点
     6 
     7 
     8 # 打印顶层的根标签
     9 print(root.tag)
    10 
    11 
    12 ######################增,删,改,查#########################
    13 
    14 #循环所有的year标签:()
    15 for node in root.iter('year'):
    16 
    17     #修改标签的中间数据
    18     new_year  = int(node.text) + 1
    19     node.text = str(new_year)
    20 
    21     #设置标签属性:
    22     node.set('name','zhangsan')
    23     node.set('age','lisi')
    24 
    25     #删除标签属性:
    26     del node.attrib['name']
    27 
    28     #查看标签名称、属性、标签内容
    29     print(node.tag,node.attrib)
    30     print(node.text)
    31 
    32 
    33 #######################保存########################
    34 
    35 #使ElementTree方法将内存的root保存一个变量里:
    36 tree = ET.ElementTree(root)
    37 
    38 #将XML的变量写入新的文件中:
    39 tree.write('newox.xml',encoding='utf-8')

    2、文本文档格式:

     1 from xml.etree import ElementTree as ET
     2 
     3 tree = ET.parse("ox.xml") #直接解析XML文件
     4 root = tree.getroot()    #获取xml文件的根节点
     5 
     6 
     7 #打印顶层的根标签
     8 print(root)
     9 
    10 ######################增,删,改,查#########################
    11 
    12 #循环所有year标签:
    13 for node in root.iter('year'):
    14 
    15     #修改year标签中的数据(将year节点中的内容自增一)
    16     new_year = int(node.text) + 1
    17     node.text = str(new_year)
    18 
    19     #添加标签属性
    20     node.set('name','zhangsan')
    21     node.set('age','19')
    22 
    23     #删除标签属性
    24     del node.attrib['age']
    25 
    26     #查看标签名称、属性、标签内容
    27     print(node.tag,node.attrib)
    28     print(node.text)
    29 
    30     #修改标签属性
    31     node.set('name','lisi')
    32 
    33     #查看标签名称、属性、标签内容
    34     print(node.tag,node.attrib)
    35     print(node.text)
    36 
    37 #直接将内存中的root写入到新文件中
    38 tree.write("new.xml",encoding='utf-8')
    (三)、删除并保存:
    1、解析字符串方式打开,删除,保存:
     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')

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

     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')

    创建XML文档方法

    1、基于Element的创建:
    变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
     1 from xml.etree import ElementTree as ET
     2 
     3 ##################################创建标签和标签属性##############################
     4 #添加标签名字: 变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
     5 #创建跟节点标签和属性:
     6 root = ET.Element('father',{'name':'Baba','age':'50'})
     7 
     8 #创建儿子节点标签和属性:
     9 son1 = ET.Element('son_1',{'name':'zhangsan','age':'29'})
    10 son2 = ET.Element('son_2',{'name':'zhangsi','age':'26'})
    11 
    12 #创建孙子节点标签和属性:
    13 grandchild1 = ET.Element('sunzi_1',{'name':'zhangwu','age':'2'})
    14 grandchild2 = ET.Element('sunzi_2',{'name':'zhangliu','age':'3'})
    15 
    16 #给孙子标签内添加内容:
    17 grandchild1.text = '孙子1'
    18 grandchild2.text = '孙子2'
    19 
    20 
    21 ##################################指定标签到父子节点中################################
    22 #把孙子节点添加到儿子节点里:
    23 son1.append(grandchild1)
    24 son2.append(grandchild2)
    25 
    26 
    27 #把儿子添加到父亲(跟)节点里:
    28 root.append(son1)
    29 root.append(son2)
    30 
    31     
    32 ##################################保存文件################################
    33 #保存并写入文件:
    34 tree = ET.ElementTree(root)
    35 tree.write('oooo.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False)
    36 
    37 
    38 
    39 
    40 显示结果:
    41 <?xml version='1.0' encoding='utf-8'?>
    42 <father age="58" name="wang1">
    43     <son1 age="27" name="wang2">儿子1</son1>
    44     <son2 age="26" name="wang3">儿子2
    45         <sunzi age="19" name="wang5">孙子2</sunzi>
    46     </son2>
    47 </father>
    2、基于makeelement创建:
    变量名 = 要添加上一级标签名字.makeelement('标签名',{'k1':'v1','k2':'v2'})
     
     1 from xml.etree import ElementTree as ET
     2 
     3 #创建跟节点标签
     4 root = ET.Element('father',{'name':'zhangda','age':'58'})
     5 
     6 
     7 ##################################创建标签和标签属性##############################
     8 #创建标签格式:变量名 = 要添加上一级标签名字.makeelement('标签名',{'k1':'v1','k2':'v2'})
     9 
    10 #创建儿子节点标签和属性:
    11 #son1 = ET.Element('son1',{'name':'zhangsan','age':'28'})
    12 son1 = root.makeelement('son1',{'name':'lisi','age':'30'})
    13 #son2 = ET.Element('son2',{'name':'liwu','age':'29'})
    14 son2 = root.makeelement('son2',{'name':'lisan','age':'31'})
    15 
    16 #创建孙子节点标签和属性:
    17 #granchild1 = ET.Element('granchild1',{'name':'liwu','age':'13'})
    18 granchild_1 = son1.makeelement('granchild_1',{'name':'li5','age':'14'})
    19 
    20 #granchild2 = ET.Element('granchild2',{'name':'liliu','age':'12'})
    21 granchild_2 = son2.makeelement('granchild_2',{'name':'li6','age':'12'})
    22 
    23 
    24 ##################################指定标签到父子节点中################################    
    25 #将孙子节点添加到儿子节点:
    26 son1.append(granchild_1)
    27 son2.append(granchild_2)
    28 
    29 #将儿子节点添加到父亲节点里:
    30 root.append(son1)
    31 root.append(son2)
    32 
    33 
    34 ##################################保存文件################################
    35 tree = ET.ElementTree(root)
    36 tree.write('oooo.xml',encoding='utf-8',short_empty_elements=False)
    37 
    38 
    39 
    40 显示结果:
    41 
    42 <father age="58" name="zhangda">
    43     <son1 age="30" name="lisi">
    44         <granchild_1 age="14" name="li5"> </granchild_1>
    45     </son1>
    46     
    47     <son2 age="31" name="lisan">
    48         <granchild_2 age="12" name="li6"> </granchild_2>
    49     </son2>
    50 </father>
    3、基于SubElement的方式创建:
    变量名 = ET.SubElement(上一级标签名,'当前标签名',attrib={'k1':'v1','k2':'v2'})
     1 from xml.etree import ElementTree as ET
     2 
     3 #创建根节点:
     4 root = ET.Element("father",{'name':'wang1','age':'58'})
     5 
     6 #创建儿子节点和属性
     7 #创建格式:变量名 = ET.SubElement(上一级标签名,'当前标签名',attrib={'k1':'v1','k2':'v2'})
     8 son1 = ET.SubElement(root,"son1",attrib={'name':'wang2','age':'27'})
     9 son1.text = '儿子1'
    10 son2 = ET.SubElement(root,"son2",attrib={'name':'wang3','age':'26'})
    11 son2.text = '儿子2'
    12 
    13 #创建孙子节点
    14 
    15 #grandchild_1 = ET.SubElement(son1,"sunzi",attrib={'name':'wang4','age':'18'})
    16 #grandchild_1.text = '孙子1'
    17 grandchild_2 = ET.SubElement(son2,"sunzi",attrib={'name':'wang5','age':'19'})
    18 grandchild_2.text = '孙子2'
    19 
    20 #保存
    21 free = ET.ElementTree(root)
    22 free.write('test.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False)
    23 
    24 
    25 
    26 显示结果:
    27 <?xml version='1.0' encoding='utf-8'?>
    28 <father age="58" name="wang1">
    29     <son1 age="27" name="wang2">儿子1</son1>
    30     <son2 age="26" name="wang3">儿子2
    31         <sunzi age="19" name="wang5">孙子2</sunzi>
    32     </son2>
    33 </father>

    XML的格式化

     1 1、格式化xml函数:
     2 def prettify(elem):
     3     '''
     4     将节点转换成字符串,并添加缩进
     5     '''
     6     rough_string = ET.tostring(elem, 'utf-8')
     7     reparsed = minidom.parseString(rough_string)
     8     return reparsed.toprettyxml(indent="	")
     9 
    10 2、调用格式化函数,并将root传参:
    11 raw_str = prettify(root)
    12 
    13 3、将格式化好的变量写入文本文档:
    14 with open('oooo.xml','w',encoding='utf-8') as f:
    15     f.write(raw_str)

    案例:

     1 #!/usr/bin/env python
     2 # -*- coding:utf8 -*-
     3 # Author:Dong Ye
     4 
     5 from xml.etree import ElementTree as ET
     6 from xml.dom import minidom
     7 
     8 
     9 #格式化xml函数:
    10 def prettify(elem):
    11     '''
    12     将节点转换成字符串,并添加缩进
    13     '''
    14     rough_string = ET.tostring(elem, 'utf-8')
    15     reparsed = minidom.parseString(rough_string)
    16     return reparsed.toprettyxml(indent="	")
    17 
    18 
    19 ##################################创建标签和标签属性##############################
    20 #添加标签名字: 变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
    21 #创建跟节点标签和属性:
    22 root = ET.Element('father',{'name':'Baba','age':'50'})
    23 
    24 #创建儿子节点标签和属性:
    25 son1 = ET.Element('son_1',{'name':'zhangsan','age':'29'})
    26 son2 = ET.Element('son_2',{'name':'zhangsi','age':'26'})
    27 
    28 #创建孙子节点标签和属性:
    29 grandchild1 = ET.Element('sunzi_1',{'name':'zhangwu','age':'2'})
    30 grandchild2 = ET.Element('sunzi_2',{'name':'zhangliu','age':'3'})
    31 
    32 #给孙子标签内添加内容:
    33 grandchild1.text = '儿子1--孙子1'
    34 grandchild2.text = '儿子2--孙子2'
    35 
    36 
    37 ##################################指定标签到父子节点中################################
    38 #把孙子节点添加到儿子节点里:
    39 son1.append(grandchild1)
    40 son2.append(grandchild2)
    41 
    42 
    43 #把儿子添加到父亲(跟)节点里:
    44 root.append(son1)
    45 root.append(son2)
    46 
    47 ##################################保存文件################################
    48 #保存并写入文件:
    49 # tree = ET.ElementTree(root)
    50 # tree.write('oooo.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False)
    51 
    52 
    53 raw_str = prettify(root)
    54 
    55 with open('oooo.xml','w',encoding='utf-8') as f:
    56     f.write(raw_str)
    View Code

  • 相关阅读:
    [导入]C#播放rm文件[转贴]
    新工具软件发布!名称:剪切板记录器
    黑發4/14
    sql20002 4/19
    頁面按百分比設定失調3/27
    廣告控件:AdRotator 3/23
    19992020小農曆JS 3/31
    ASP.NET1.1編譯錯誤代碼:1073741502 4/10
    SiteMapPath控件 3/24
    MYSQL時間問題4/16
  • 原文地址:https://www.cnblogs.com/abobo/p/8109466.html
Copyright © 2011-2022 走看看