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

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

2、XML格式如下:

 <data>  #表示跟节点的开头
<country name="CTO" TEL='' >
<zongjian name='zhangsan' age=''>
<jingli name='wangwu' age=''>
.....(其他属性)
</jingli>
</zongjian>
<zongjian name='lisi' age=''>2023</zongjian>
</country>
<country name="CEO">
<rank updated="yes">5</rank>
<year>2026</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="COO">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data> #表示根节点的结尾

3、要点:

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

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

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

解析XML

XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
 1、字符串解析:
(利用ElementTree.XML将字符串解析成xml对象)
from xml.etree import ElementTree as ET

# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read()      #这种方法也可以利用在requests请求后,返回来的xml结果集

# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
注:保存方法分2步(a、使ElementTree方法将内存的root保存一个变量里;b、然后在将变量写入到一个新的文件里) 2、文本文件直接解析:
(利用ElementTree.parse将文件直接解析成xml对象)
from xml.etree import ElementTree as ET

# 直接解析xml文件
tree = ET.parse("xo.xml")

# 获取xml文件的根节点
root = tree.getroot()
注:用解析XML文件的变量,直接写入到新文件中。 由于每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),所以可以利用以上方法进行操作xml文件。

操作XML

(一)、遍币:
1、遍币XML文档的所有内容:
 from xml.etree import ElementTree as ET

 ############ 解析方式一 ############
"""
#字符串的方式解析
# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
"""
############ 解析方式二 ############
#以文本文档格式解析
# 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ### 操作 # 顶层标签
print(root.tag) # 遍历XML文档的第二层
for child in root:
# 第二层节点的标签名称和标签属性
print(child.tag, child.attrib)
# 遍历XML文档的第三层
for i in child:
# 第二层节点的标签名称和内容
print(i.tag,i.text)

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

 from xml.etree import ElementTree as ET

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

2、文本文档格式:

 from xml.etree import ElementTree as ET

 tree = ET.parse("ox.xml") #直接解析XML文件
root = tree.getroot() #获取xml文件的根节点 #打印顶层的根标签
print(root) ######################增,删,改,查######################### #循环所有year标签:
for node in root.iter('year'): #修改year标签中的数据(将year节点中的内容自增一)
new_year = int(node.text) + 1
node.text = str(new_year) #添加标签属性
node.set('name','zhangsan')
node.set('age','') #删除标签属性
del node.attrib['age'] #查看标签名称、属性、标签内容
print(node.tag,node.attrib)
print(node.text) #修改标签属性
node.set('name','lisi') #查看标签名称、属性、标签内容
print(node.tag,node.attrib)
print(node.text) #直接将内存中的root写入到新文件中
tree.write("new.xml",encoding='utf-8')
(三)、删除并保存:
1、解析字符串方式打开,删除,保存:
 from xml.etree import ElementTree as ET

 ############ 解析字符串方式打开 ############

 # 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签
print(root.tag) # 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text) if rank > 50:
# 删除指定country节点
root.remove(country) ############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')

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

 from xml.etree import ElementTree as ET

 ############ 解析文件方式 ############

 # 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ############ 操作 ############ # 顶层标签
print(root.tag) # 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text) if rank > 50:
# 删除指定country节点
root.remove(country) ############ 保存文件 ############
tree.write("newnew.xml", encoding='utf-8')

创建XML文档方法

1、基于Element的创建:
变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
 from xml.etree import ElementTree as ET

 ##################################创建标签和标签属性##############################
#添加标签名字: 变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
#创建跟节点标签和属性:
root = ET.Element('father',{'name':'Baba','age':''}) #创建儿子节点标签和属性:
son1 = ET.Element('son_1',{'name':'zhangsan','age':''})
son2 = ET.Element('son_2',{'name':'zhangsi','age':''}) #创建孙子节点标签和属性:
grandchild1 = ET.Element('sunzi_1',{'name':'zhangwu','age':''})
grandchild2 = ET.Element('sunzi_2',{'name':'zhangliu','age':''}) #给孙子标签内添加内容:
grandchild1.text = '孙子1'
grandchild2.text = '孙子2' ##################################指定标签到父子节点中################################
#把孙子节点添加到儿子节点里:
son1.append(grandchild1)
son2.append(grandchild2) #把儿子添加到父亲(跟)节点里:
root.append(son1)
root.append(son2) ##################################保存文件################################
#保存并写入文件:
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False) 显示结果:
<?xml version='1.0' encoding='utf-8'?>
<father age="" name="wang1">
<son1 age="" name="wang2">儿子1</son1>
<son2 age="" name="wang3">儿子2
<sunzi age="" name="wang5">孙子2</sunzi>
</son2>
</father>
2、基于makeelement创建:
变量名 = 要添加上一级标签名字.makeelement('标签名',{'k1':'v1','k2':'v2'})
 
 from xml.etree import ElementTree as ET

 #创建跟节点标签
root = ET.Element('father',{'name':'zhangda','age':''}) ##################################创建标签和标签属性##############################
#创建标签格式:变量名 = 要添加上一级标签名字.makeelement('标签名',{'k1':'v1','k2':'v2'}) #创建儿子节点标签和属性:
#son1 = ET.Element('son1',{'name':'zhangsan','age':'28'})
son1 = root.makeelement('son1',{'name':'lisi','age':''})
#son2 = ET.Element('son2',{'name':'liwu','age':'29'})
son2 = root.makeelement('son2',{'name':'lisan','age':''}) #创建孙子节点标签和属性:
#granchild1 = ET.Element('granchild1',{'name':'liwu','age':'13'})
granchild_1 = son1.makeelement('granchild_1',{'name':'li5','age':''}) #granchild2 = ET.Element('granchild2',{'name':'liliu','age':'12'})
granchild_2 = son2.makeelement('granchild_2',{'name':'li6','age':''}) ##################################指定标签到父子节点中################################
#将孙子节点添加到儿子节点:
son1.append(granchild_1)
son2.append(granchild_2) #将儿子节点添加到父亲节点里:
root.append(son1)
root.append(son2) ##################################保存文件################################
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8',short_empty_elements=False) 显示结果: <father age="" name="zhangda">
<son1 age="" name="lisi">
<granchild_1 age="" name="li5"> </granchild_1>
</son1> <son2 age="" name="lisan">
<granchild_2 age="" name="li6"> </granchild_2>
</son2>
</father>
3、基于SubElement的方式创建:
变量名 = ET.SubElement(上一级标签名,'当前标签名',attrib={'k1':'v1','k2':'v2'})
 from xml.etree import ElementTree as ET

 #创建根节点:
root = ET.Element("father",{'name':'wang1','age':''}) #创建儿子节点和属性
#创建格式:变量名 = ET.SubElement(上一级标签名,'当前标签名',attrib={'k1':'v1','k2':'v2'})
son1 = ET.SubElement(root,"son1",attrib={'name':'wang2','age':''})
son1.text = '儿子1'
son2 = ET.SubElement(root,"son2",attrib={'name':'wang3','age':''})
son2.text = '儿子2' #创建孙子节点 #grandchild_1 = ET.SubElement(son1,"sunzi",attrib={'name':'wang4','age':'18'})
#grandchild_1.text = '孙子1'
grandchild_2 = ET.SubElement(son2,"sunzi",attrib={'name':'wang5','age':''})
grandchild_2.text = '孙子2' #保存
free = ET.ElementTree(root)
free.write('test.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False) 显示结果:
<?xml version='1.0' encoding='utf-8'?>
<father age="" name="wang1">
<son1 age="" name="wang2">儿子1</son1>
<son2 age="" name="wang3">儿子2
<sunzi age="" name="wang5">孙子2</sunzi>
</son2>
</father>

XML的格式化

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

案例:

 #!/usr/bin/env python
# -*- coding:utf8 -*-
# Author:Dong Ye from xml.etree import ElementTree as ET
from xml.dom import minidom #格式化xml函数:
def prettify(elem):
'''
将节点转换成字符串,并添加缩进
'''
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t") ##################################创建标签和标签属性##############################
#添加标签名字: 变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
#创建跟节点标签和属性:
root = ET.Element('father',{'name':'Baba','age':''}) #创建儿子节点标签和属性:
son1 = ET.Element('son_1',{'name':'zhangsan','age':''})
son2 = ET.Element('son_2',{'name':'zhangsi','age':''}) #创建孙子节点标签和属性:
grandchild1 = ET.Element('sunzi_1',{'name':'zhangwu','age':''})
grandchild2 = ET.Element('sunzi_2',{'name':'zhangliu','age':''}) #给孙子标签内添加内容:
grandchild1.text = '儿子1--孙子1'
grandchild2.text = '儿子2--孙子2' ##################################指定标签到父子节点中################################
#把孙子节点添加到儿子节点里:
son1.append(grandchild1)
son2.append(grandchild2) #把儿子添加到父亲(跟)节点里:
root.append(son1)
root.append(son2) ##################################保存文件################################
#保存并写入文件:
# tree = ET.ElementTree(root)
# tree.write('oooo.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False) raw_str = prettify(root) with open('oooo.xml','w',encoding='utf-8') as f:
f.write(raw_str)

模块讲解----XML模块的更多相关文章

  1. python常用模块之xml模块

    python常用模块之xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,在json还没诞生的年代,大家都是使用xml,目前很多传统公司的系 ...

  2. logging模块、shutil模块、subprocess模块、xml模块

    logging模块 shutil模块 subprocess模块 xml模块 logging模块 函数式简单配置 import logging logging.debug('debug message' ...

  3. python全栈开发-hashlib模块(数据加密)、suprocess模块、xml模块

    一.hashlib模块 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 ...

  4. python16_day06【类、RE模块、subprocess模块、xml模块、shelve模块】

    一.shelve模块 import shelve # 基于pickle模块, d = shelve.open('shelve_test') class Test(object): def __init ...

  5. python 之 random 模块、 shutil 模块、shelve模块、 xml模块

    6.12 random 模块 print(random.random()) (0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) [1,3] 大 ...

  6. 模块讲解----hashlib模块(加密)

    作用 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 语法 import hashlib #md5 ...

  7. 模块讲解---time模块,datetime模块,random模块,hashlib模块和hmac模块,typing模块,requests模块,re模块

    目录 1. 包 2. time模块   1. 优先掌握 2. 了解 3. datetime模块   1. 优先掌握 4. random模块   1. 优先掌握   2. 了解 5. hashlib模块 ...

  8. 模块讲解---os模块,sys模块,json和pickle模块,logging模块

    目录 模块的用法 os模块 常用的功能 sys模块 常用的功能 json和pickle模块 4. logging模块 模块的用法 通过 import 或者from......import...... ...

  9. day5模块学习--XML模块

    XML文件处理 XML文件处理,有好几种方式,这里介绍一下xml.etree.ElementTree as ET. 注意:xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全 ...

随机推荐

  1. HTML5 直播技术

    https://segmentfault.com/a/1190000010440054

  2. c# 以二进制读取文本文件

    using System; using System.IO; public class FileApp {     public static void Main()     {         // ...

  3. POJ 1273 Drainage Ditches (网络最大流)

    http://poj.org/problem? id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  4. UITextField 全属性

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...

  5. python2.0_s12_day9_协程&多线程和cpu,磁盘io之间的关系

    事件驱动和异步io有什么直接关系. 当我们访问一个网页,不考虑网络问题.我们人类不觉得网页慢. 但是实际中对计算机来说还是慢.那慢在哪里.io io操作是整个网络操作中最慢的.比如你打开网页要是有2秒 ...

  6. CocoaPods的 安装 /卸载/升级

    CocoaPods用来管理第三方框架 Mac 安装 Cocoapods 导引如果你的 Mac OSX 升级到 10.11.x+, 并且需要安装 Cocoapods, 可以参考本博客.安装 rubyMa ...

  7. jdbc批处理

    批量处理允许将相关的SQL语句分组到批处理中,并通过对数据库的一次调用来提交它们,一次执行完成与数据库之间的交互. 一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能. 不需要JDBC驱 ...

  8. 深入浅出Docker(四):Docker的集成测试部署之道

    1. 背景 敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心.迭代.循序渐进的开发理念.在这样的场景下引入Docker技术,首要目的就是使用Docker提供的虚拟化方 ...

  9. vscode中的vue文件中emmet进行tab键不起作用

    文件--首选项---设置 搜索: emmet.includeLanguages在右边修改 "emmet.triggerExpansionOnTab": true, "em ...

  10. sencha touch 入门系列 (九)sencha touch 视图组件简介

    对于一个普通用户来说,你的项目就是一组简单的视图集合,用户直接通过跟视图进行交互来操作你的应用,对于一个开发人员来说,视图是一个项目的入口,虽然大部分时候最有价值的部分是在model层和control ...