一、简述

xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它用于不同语言或者程序之间进行数据交换,从这点上讲与json差不多,只不过json看起来更美观、可读性更强。另外json诞生的时间并不是很久,在json出现以前,数据交换只能选择xml,即便是json已经在大面积使用的现在,xml依然被广泛使用,java项目中随处可见啊。

二、xml的结构

先来看一个栗子把:

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

OK,从结构上,它很像我们常见的HTML超文本标记语言。但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观。它被设计用来传输和存储数据,其焦点是数据的内容。
结构特征解读如下:

  • 它由成对的标签组成 <data></data>
    一级标签称为根节点,其他级别的标签称为节点
  • 标签可以有属性 <country name="Panama">
  • 标签对可以嵌入数据 <year>2011</year>
    嵌入的数据即为节点的值
  • 标签可以嵌入子标签(具有层级关系)

三、通过python操作xml文件

就以上面的xml文件为例来看看怎么通过python操作xml文件把。

3.1 读取xml文件内容

  1 import xml.etree.ElementTree as et
  2 tree = et.parse('test.xml')
  3 root = tree.getroot() #获取根节点
  4 print(root.tag) #打印根节点
  5
  6
  7 for child in root:
  8     print('-----')
  9     print('\t', child.tag, child.attrib)  #分别打印子节点名称和子节点属性
 10     #遍历子节点下的所有节点
 11     for i in child:
 12         print('\t\t', i.tag, i.text, i.attrib) #打印子节点下节点的节点名、节点值和属性
 13     #只遍历year节点
 14     for i in child.iter('year'):
 15         print('\t\t\t', i.tag, i.text)
 16
 17 print('')
 18 for node in root.iter('year'):   #从根节点上直接遍历year节点
 19     print(node.tag, node.text)
 20
 21 程序输出:
 22 data
 23 -----
 24      country {'name': 'Liechtenstein'}
 25          rank 2 {'updated': 'yes'}
 26          year 2008 {}
 27          gdppc 141100 {}
 28          neighbor None {'name': 'Austria', 'direction': 'E'}
 29          neighbor None {'name': 'Switzerland', 'direction': 'W'}
 30              year 2008
 31 -----
 32      country {'name': 'Singapore'}
 33          rank 5 {'updated': 'yes'}
 34          year 2011 {}
 35          gdppc 59900 {}
 36          neighbor None {'name': 'Malaysia', 'direction': 'N'}
 37              year 2011
 38 -----
 39      country {'name': 'Panama'}
 40          rank 69 {'updated': 'yes'}
 41          year 2011 {}
 42          gdppc 13600 {}
 43          neighbor None {'name': 'Costa Rica', 'direction': 'W'}
 44          neighbor None {'name': 'Colombia', 'direction': 'E'}
 45              year 2011
 46
 47 year 2008
 48 year 2011
 49 year 2011
 50 

说明:

1. getroot()用于返回根节点,tag返回节点名,attrib返回节点属性,text返回节点的值

2. 只返回某个节点的信息,使用iter(节点名)即可

3.2 修改xml文件内容

  1 import xml.etree.ElementTree as et
  2 tree = et.parse('test.xml')
  3 root = tree.getroot()
  4
  5 print(type(root.iter('year')))
  6 for node in root.iter('year'):
  7     new_year = int(node.text) + 1
  8     node.text = str(new_year) #修改节点值
  9     node.tag = 'next_year' #修改节点名称
 10     node.set('Maxwell','handsome') #修改节点属性
 11
 12 tree.write('test2.xml') #保存文件

注意最后一步保存操作不能漏掉!
修改的实际效果如下:

3.3 删除xml节点

  1 import xml.etree.ElementTree as et
  2
  3 tree = et.parse('test.xml')
  4 root = tree.getroot()
  5
  6
  7 for country in root.findall('country'):  #查找第一层子节点
  8     rank = int(country.find('rank').text) #查找子节点下的子节点
  9     if rank > 50:
 10         root.remove(country)  #删除符合条件的节点
 11
 12 tree.write('test2.xml')

注意:

  1. findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址
  2. 删除节点用remove()方法
  3. 删除后需要write保存

3.4 创建新的xml文件

  1 import xml.etree.ElementTree as et
  2
  3 #创建根节点
  4 new_xml = et.Element('profile')
  5 #创建根节点的第一层子节点,参数依次表示父节点,子节点名称,子节点属性
  6 name = et.SubElement(new_xml, 'name', attrib={'Luzhishen':'HuaHeSang'})
  7 age = et.SubElement(name, 'age', attrib={'adult':'yes'})
  8 #设置子节点的值
  9 age.text = '22'
 10 gender = et.SubElement(name, 'gender')
 11 gender.text = 'man'
 12 #创建第二个根节点的第一层子节点
 13 name2 = et.SubElement(new_xml, 'name', attrib={'WuYong':'Zhiduoxing'})
 14 age2 = et.SubElement(name2, 'age')
 15 age2.text = '23'
 16
 17 #生成新的xml文档
 18 ET = et.ElementTree(new_xml)
 19 #保存文档
 20 ET.write('my.xml', encoding='utf-8', xml_declaration='true')
 21 #打印文档格式
 22 et.dump(new_xml)

创建的xml文档格式:

可以看出与一般的xml文件相比就差缩进了,不过不影响数据交换啦。

注意:

转载于:https://www.cnblogs.com/linupython/p/8308315.html

day5-xml模块相关推荐

  1. python常用内置模块-Python常用内置模块之xml模块

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  2. python常用内置模块-Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  3. python中xml模块_python常用模块之xml模块

    使用xml模块需先引入模块名: #! /usr/bin/env python # -*- coding:utf-8 -*- import xml.etree.ElementTree as ET #ET ...

  4. python模块--json \ pickle \ shelve \ XML模块

    一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...

  5. xml模块、项目开发过程

    一.XML模块 xml指的是可扩展标记语言,是一种定义电子文档结构和描述的语言,可以用来标记数据.定义数据类型. 什么时候用xml? 当需要自定义文档结构时,使用xml.在java中经常会使用xml来 ...

  6. 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)

    文章目录 json模块 正常数据转化(复杂) json模块的相关操作 pickle模块 shelve模块 xml模块 在Python中,json模块.pickle模块.xml模块.shelve模块这四 ...

  7. python解析xml生成代码_python解析xml模块封装代码

    有如下的xml文件: 复制代码 代码如下: 1 2 下面介绍python解析xml文件的几种方法,使用python模块实现. 方式1,python模块实现自动遍历所有节点: 复制代码 代码如下: #! ...

  8. Python之路(第十六篇)xml模块、datetime模块

    一.xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单, xml比较早,早期许多软件都是用xml,至今很多传统公司如金融行业的很多系统的接口还主要 ...

  9. Python攻克之路-xml模块

    xml模块 描述:xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但是Json使用起来更简单,json还没有诞生时,xml已经开始使用很久,至今很多传统公司如金融行业很多系统的接口 ...

  10. Python——XML模块

    Python--XML模块 xml跟json差不多,是实现不同语言或程序进行数据交换的一种协议.json使用起来更好更简单,但因为xml出来的早,直到现在大多数传统行业比如金融行业都在使用. 如果模块 ...

最新文章

  1. Tomcat介绍、安装JDK、安装Tomcat
  2. php 子类调用父类的方法
  3. React全栈之Instagram开源视频教程
  4. iOS 推送通知及推送扩展
  5. 给定一个N位数,得到一个N-k位的数中最小的数
  6. Unity5 Space Shooter基础部分开发笔记
  7. 【原创】定制ROM时自定义默认主题
  8. 5. Web 的结构组件
  9. 广西小学计算机教案上册,广西三年级信息技术教案
  10. http协议,postget请求
  11. Apollo ROS安装教程
  12. 求学信计算机专业英语,求学信英文版范文
  13. 程序设计 :题解+总结
  14. .NET中XML 注释 SandCastle 帮助文件.hhp 使用HTML Help Workshop生成CHM文件
  15. 如何在WPS文字中插入打勾(叉)方框
  16. 关于中小学编程教育的一些看法
  17. 淘宝API upload_img - 上传图片到淘宝
  18. 中国第一个IT职场情商测评
  19. linux怎么生成图形,如何在Ubuntu 16.04中创建GIF动态图片
  20. 树莓派ADC(ADS1115)读取Voltage Sensor(电压检测模块)

热门文章

  1. 数据库压测 oracle,sysbench压测Oracle
  2. print writer保留原有信息写文件_Python读写EXCEL文件常用方法大全 - pythonputao
  3. matlab 小波变换_连续小波变换实现方法的总结及其程序详解
  4. hadoop—集群配置历史服务器及访问历史服务器日志
  5. mysql 连接 中文_大佬们E语言连接MYSQL输出中文乱码怎么破
  6. 星空主题设计理念_敏捷协调,智慧运营:金蝶云·星空的产品设计理念与应用实践...
  7. 直播画面抖动_罗永浩直播带货1.1个亿,企业想玩网络直播,三大专业设备你必须知道...
  8. python机制_python 加载模块机制
  9. python 物联网开发板_物联网学什么开发板好?
  10. onpagefinished等了很久才执行_其实,无所事事的日子才过得最累