XML文件处理

XML文件处理,有好几种方式,这里介绍一下xml.etree.ElementTree as ET。

注意:xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全。

每个element对象都具有以下属性:

1. tag:string对象,表示数据代表的种类;

2. attrib:dictionary对象,表示附有的属性;

3. text:string对象,表示element的内容;

4. tail:string对象,表示element闭合之后的尾迹;

5. 若干子元素(child elements)。

<tag attrib1=1>text</tab>tail

1     2       3         4

创建元素的方法有Element或者SubElement(),前者称作元素的构建函数(constructor),用以构建任一独存的元素;后者称作元素的制造函数(factory function),用以制造某一元素的子元素。

有了一串元素之后,使用ElementTree类来将其打包,把一串元素转换为xml文件或者XML文件中解析出来。

若想加快速度,可以使用C语言编译的API xml.etree.cElementTree。

在使用xml.etree.ElementTree时,一般都按如下导入:

try:
    import xml.etree.ElementTree as ET
  except ImportError:
    import xml.etree.cElementTree as ET

XML是中结构化数据形式,在ET中使用ElementTree代表整个XML文档,并视其为一棵树,Element代表这个文档树中的单个节点。

ET对象具有多种方法从不同来源导入数据,如下:

#从硬盘的xml文件读取数据
try:
import xml.etree.ElementTree as ET
except ImportError:
import xml.etree.cElementTree as ET tree = ET.parse("XML文件") #载入数据
root = tree.getroot()
print(root)
print(root.tag) #获取根节点

#遍历xml文档

try:
import xml.etree.ElementTree as ET
except ImportError:
import xml.etree.cElementTree as ET tree = ET.parse("XML文件") #载入数据
root = tree.getroot()
for child in root: #遍历节点
print(child.tag,child.attrib)
输出如下:
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}

#只遍历year 节点

try:
import xml.etree.ElementTree as ET
except ImportError:
import xml.etree.cElementTree as ET tree = ET.parse("XML文件") #载入数据
root = tree.getroot()
for node in root.iter("year"):
print(node.tag,node.text)
输出如下:
year 2008
year 2011
year 201

修改和删除xml文档内容

try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET tree = ET.parse("XML文件") #载入数据
root = tree.getroot()
#修改
for node in root.iter("year"):
new_year = int(node.text) + #node.text()值,属性的值
node.text = str(new_year)
node.set("update","yes") tree.write("XML文件") #修改文件之后,重新写入文件里面,不然修改文件是无效的 #删除node
for country in root.findall("country"):
rank = int(country.find("rank").text)
if rank > :
root.remove(country) tree.write("output.xml")

文件操作中,每次修改完成数据之后,要重新写会文件之中,不然修改文件是没有用的。要重新写会文件才有效果。

Element中的遍历与查询

Element.iter(tag=None):遍历该Element所有后代,也可以指定tag进行遍历寻找。

try:
    import xml.etree.ElementTree as ET
  except ImportError:
    import xml.etree.cElementTree as ET
  tree = ET.parse("XML文件") #载入数据
  root = tree.getroot()
  for node in root.iter():
    print(node)

Element.findall(path):查找当前元素下tag或path能够匹配的直系节点。

Element.find(path):查找当前元素下tag或path能够匹配的首个直系节点。

Element.text: 获取当前元素的text值。

Element.get(key, default=None):获取元素指定key对应的属性值,如果没有该属性,则返回default值。

ElementTree对象

class xml.etree.ElementTree.ElementTree(element=None, file=None)
  element如果给定,则为新的ElementTree的根节点。   _setroot(element):用给定的element替换当前的根节点。慎用。
  
  # 以下方法与Element类中同名方法近似,区别在于它们指定以根节点作为操作对象。
  find(match)
  findall(match)
  findtext(match, default=None)
  getroot():获取根节点.
  iter(tag=None)
  iterfind(match)
  parse(source, parser=None):装载xml对象,source可以为文件名或文件类型对象.
  write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None,method="xml")

自己创建xml文档

import xml.etree.ElementTree as ET       

new_xml = ET.Element("namelist")                                     #根节点namelist
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) #SubElement()子节点,new_xml的子节点
age = ET.SubElement(name,"age",attrib={"checked":"no"}) #创建子节点,name下的age节点
sex = ET.SubElement(name,"sex")
age.text = '' #写入值,age赋值
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '' et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True) ET.dump(new_xml) #打印生成的格式

day5模块学习--XML模块的更多相关文章

  1. python常用模块之xml模块

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

  2. day5模块学习 -- os模块学习

    python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ...

  3. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

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

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

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

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

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

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

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

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

  8. day5模块学习--hashlib模块

    hashlib模块     Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

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

       使用ConfigParser模块读写ini文件(http://blog.csdn.net/linda1000/article/details/11729561) ConfigParserPyth ...

随机推荐

  1. P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚 你有一段区间需要被覆盖(长度 <= 86,399) 现有 \(n \leq 10000\) 段小线段, 每段可 ...

  2. Linux 下搭建 Svn+Apache

    一.安装apache 1.检查apache是否安装 rpm -qa|grep httpd 2.使用yum安装apache yum -y install httpd 3.记住安装的版本号 httpd.x ...

  3. 2 Kafka Broker

    Log的读写.删除流程---日志管理器(log manager)负责创建日志.获取日志.清理日志.所有的日志读写操作都交给具体的日志实例来完成. KafkaServer启动的时候,初始化三个类: Lo ...

  4. M-JPEG、MPEG4、H.264都有何区别

    压缩方式是网络视频服务器和网络摄像机的核心技术,压缩方式很大程度上决定着图像的质量.压缩比.传输效率.传输速度等性能,它是评价网络视频服务器和网络摄像机性能优劣的重要一环.随着多媒体技术的发展,相继推 ...

  5. Redis学习四:解析配置文件 redis.conf

    一.它在哪 地址: 思考:为什么要将它拷贝出来单独执行? 二.Units单位 1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 2 对大小写不敏感 三.INCLUDES包 ...

  6. Java并发编程原理与实战十六:AQS

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  7. Swift动态添加UIImageView并添加事件

    Swift动态添加UIImageView并添加事件: 1. 创建UIImageView实例,并进行初始化 2. 设置UIImageView的用户交互属性userInteractionEnabled为T ...

  8. Visual Leak Detector原理剖析

    认识VLD VLD(Visual Leak Detector)是一款用于Visual C++的开源内存泄漏检测工具,我们只需要在被检测内存泄漏的工程代码里#include “vld.h”就可以开启内存 ...

  9. 【leetcode 简单】 第九十二题 第N个数字

    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 注意: n 是正数且在32为整形范围内 ( n < 231). 示例 1: ...

  10. linux查看及设置别名,权限,生成ssh秘钥

    1.alias :查看系统中所有的命令别名 2.设定别名 alias 别名='原命令' 3.删除别名 unalias 别名 4.使别名永久生效    vi  ~/.bashrc  写入这个文件中即可永 ...