xml.etree.ElementTree模块实现了一个简单而有效的用户解析和创建XML数据的API。

在python3.3版本中,该模块进行了一些修改:

xml.etree.cElementTree模块被弃用。

警告:xml.etree.ElementTree模块在解析恶意构造的数据会产生一定的安全隐患。所以使用该模块的时候需要谨慎。

下面来看看该模块是怎样解析和创建XML数据文档的。

首先,我们应该了解一下什么是XML树和元素,XML是一种固有的层次化数据格式,这是一种最自然的格式类表示一棵树。

xml.etree.ElementTree(简写ET)就此而言,ElementTree代表的是整个XML无奈的和元素的一棵树,这棵树有一个唯一的

root根节点。在根节点下面,可以有很多子节点,而每一个子节点又可以有自己的属性或子节点....

我们今天需要解析的XML文件的内容如下:

我把该XML文件保存在:c:\\test\\hongten.xml文件中

 <?xml version="1.0" encoding="UTF-8"?>
<students>
<student no="2009081097">
<name>Hongten</name>
<gender>M</gender>
<age>20</age>
<score subject="math">97</score>
<score subject="chinese">90</score>
</student>
<student no="2009081098">
<name>DuDu</name>
<gender>W</gender>
<age>21</age>
<score subject="math">87</score>
<score subject="chinese">96</score>
</student>
<student no="2009081099">
<name>Sum</name>
<gender>M</gender>
<age>19</age>
<score subject="math">64</score>
<score subject="chinese">98</score>
</student>
</students>

在上面的XML文件内容中,我们可以看到此XML文件的根节点为:students
我们可以通过下面的方法获取到根节点

 import xml.etree.ElementTree as ET
tree = ET.parse('c:\\test\\hongten.xml')
root = tree.getroot()
tag = root.tag #students

同样的我们也可以获取到根节点的属性

 attrib = root.attrib     #{}

因为根节点:students是没有属性的,所以为空。

我们要获取根节点:students的子节点名称和属性

  for child in root:
print(child.tag, child.attrib)

输出为:

student {'no' : ''}
student {'no' : ''}
student {'no' : ''}

我们同样可以获取属性对应的值

 for student in root.findall('student'):
no = student.get('no')
name = student.find('name').text
print(no, name)

输出为:

2009081097 Hongten
2009081098 DuDu
2009081099 Sum

当然,我们也可以修改XML文件的内容:

 for age in root.iter('age'):
new_age = int(age.text) + 1
age.text = str(new_age)
age.set('updated', 'yes')
tree.write('c:\\test\\hongten_update.xml')

修改后的XML文件内容如下:

 <students>
<student no="2009081097">
<name>Hongten</name>
<gender>M</gender>
<age updated="yes">21</age>
<score subject="math">97</score>
<score subject="chinese">90</score>
</student>
<student no="2009081098">
<name>DuDu</name>
<gender>W</gender>
<age updated="yes">22</age>
<score subject="math">87</score>
<score subject="chinese">96</score>
</student>
<student no="2009081099">
<name>Sum</name>
<gender>M</gender>
<age updated="yes">20</age>
<score subject="math">64</score>
<score subject="chinese">98</score>
</student>
</students>

==================================================================

以下是我对xml.etree.ElementTree模块进行了一些封装

==================================================================

 # -*- coding: utf-8 -*-
#python xml.etree.ElementTree #Author : Hongten
#Mailto : hongtenzone@foxmail.com
#Blog : http://www.cnblogs.com/hongten
#QQ : 648719819
#Version : 1.0
#Create : 2013-09-03 import os
import xml.etree.ElementTree as ET '''
在python中,解析XML文件有很多中方法
本文中要使用的方法是:xml.etree.ElementTree
'''
#global var
#show log
SHOW_LOG = True
#XML file
XML_PATH = None def get_root(path):
'''parse the XML file,and get the tree of the XML file
finally,return the root element of the tree.
if the XML file dose not exist,then print the information'''
if os.path.exists(path):
if SHOW_LOG:
print('start to parse the file : [{}]'.format(path))
tree = ET.parse(path)
return tree.getroot()
else:
print('the path [{}] dose not exist!'.format(path)) def get_element_tag(element):
'''return the element tag if the element is not None.'''
if element is not None:
if SHOW_LOG:
print('begin to handle the element : [{}]'.format(element))
return element.tag
else:
print('the element is None!') def get_element_attrib(element):
'''return the element attrib if the element is not None.'''
if element is not None:
if SHOW_LOG:
print('begin to handle the element : [{}]'.format(element))
return element.attrib
else:
print('the element is None!') def get_element_text(element):
'''return the text of the element.'''
if element is not None:
return element.text
else:
print('the element is None!') def get_element_children(element):
'''return the element children if the element is not None.'''
if element is not None:
if SHOW_LOG:
print('begin to handle the element : [{}]'.format(element))
return [c for c in element]
else:
print('the element is None!') def get_elements_tag(elements):
'''return the list of tags of element's tag'''
if elements is not None:
tags = []
for e in elements:
tags.append(e.tag)
return tags
else:
print('the elements is None!') def get_elements_attrib(elements):
'''return the list of attribs of element's attrib'''
if elements is not None:
attribs = []
for a in elements:
attribs.append(a.attrib)
return attribs
else:
print('the elements is None!') def get_elements_text(elements):
'''return the dict of element'''
if elements is not None:
text = []
for t in elements:
text.append(t.text)
return dict(zip(get_elements_tag(elements), text))
else:
print('the elements is None!') def init():
global SHOW_LOG
SHOW_LOG = True
global XML_PATH
XML_PATH = 'c:\\test\\hongten.xml' def main():
init()
#root
root = get_root(XML_PATH)
root_tag = get_element_tag(root)
print(root_tag)
root_attrib = get_element_attrib(root)
print(root_attrib)
#children
children = get_element_children(root)
print(children)
children_tags = get_elements_tag(children)
print(children_tags)
children_attribs = get_elements_attrib(children)
print(children_attribs) print('#' * 50)
#获取二级元素的每一个子节点的名称和值
for c in children:
c_children = get_element_children(c)
dict_text = get_elements_text(c_children)
print(dict_text) if __name__ == '__main__':
main()

运行效果:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
start to parse the file : [c:\test\hongten.xml]
begin to handle the element : [<Element 'students' at 0x0215C5A0>]
students
begin to handle the element : [<Element 'students' at 0x0215C5A0>]
{}
begin to handle the element : [<Element 'students' at 0x0215C5A0>]
[<Element 'student' at 0x0215C600>, <Element 'student' at 0x0215C750>, <Element 'student' at 0x0215C870>]
['student', 'student', 'student']
[{'no': ''}, {'no': ''}, {'no': ''}]
##################################################
begin to handle the element : [<Element 'student' at 0x0215C600>]
{'score': '', 'gender': 'M', 'name': 'Hongten', 'age': ''}
begin to handle the element : [<Element 'student' at 0x0215C750>]
{'score': '', 'gender': 'W', 'name': 'DuDu', 'age': ''}
begin to handle the element : [<Element 'student' at 0x0215C870>]
{'score': '', 'gender': 'M', 'name': 'Sum', 'age': ''}
>>>

========================================================

More reading,and english is important.

I'm Hongten

大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
Hongten博客排名在100名以内。粉丝过千。
Hongten出品,必是精品。

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

========================================================

python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用的更多相关文章

  1. python开发_xml.dom_解析XML文档_完整版_博主推荐

    在阅读之前,你需要了解一些xml.dom的一些理论知识,在这里你可以对xml.dom有一定的了解,如果你阅读完之后. 下面是我做的demo 运行效果: 解析的XML文件位置:c:\\test\\hon ...

  2. Python开发【第五章】:常用模块

    一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...

  3. Python开发基础-Day15正则表达式爬虫应用,configparser模块和subprocess模块

    正则表达式爬虫应用(校花网) import requests import re import json #定义函数返回网页的字符串信息 def getPage_str(url): page_stri ...

  4. python命令行运行py文件找不到模块的解决办法

    问题: 新建了一个项目,目录结构如下: 然后在pycharm中运行glovar是没有问题的,但是在命令行中运行就会提示找不到init模块 这是因为在pycharm中运行的时候,pycharm会自动将项 ...

  5. python学习,excel操作之xlrd模块常用操作

    import xlrd ##工作表## #打开excel f = xlrd.open_workbook("test.xlsx") file = f.sheet_by_name(&q ...

  6. python循环解压rar文件

    python循环解压rar文件 C:. │ main.py │ ├─1_STL_算法简介 │ STL_算法简介.rar │ └─2_STL_算法_填充新值 STL_算法_填充新值.rar 事情是这样的 ...

  7. Python快速学习08:模块的操作

    前言 系列文章:[传送门] 天气干燥,我就上火,流鼻血.希望身子好起来. 正文 函数和对象都是为了更好的组织已经有的程序,以方便重复利用. 模块(module)也是为了同样的目的.模块可以包含可执行代 ...

  8. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

  9. 二十九 Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    selenium模块 selenium模块为第三方模块需要安装,selenium模块是一个操作各种浏览器对应软件的api接口模块 selenium模块是一个操作各种浏览器对应软件的api接口模块,所以 ...

随机推荐

  1. Gradle教程链接

    Gradle教程:https://www.yiibai.com/gradle/ https://www.cnblogs.com/wxishang1991/p/5532006.html

  2. 洛谷P2149 Elaxia的路线

    传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...

  3. c语言循环链表的问题

    今天,老师说了一道题,大意是,有一群小朋友10个人,但是老师只有一个苹果,只能给一个小朋友,于是老师就决定让小朋友们做成一圈,从第一个小朋友开始,每隔一个小朋友就没有机会得到苹果,最后剩下的一个人可以 ...

  4. HBase混布MapReduce集群学习记录

    一.准备工作 1.1 部署环境 集群规模大概260多台,TSC10机型,机型参数如下: > 1个8核CPU(E5-2620v4) > 64G内存 > HBA,12*4T SATA,1 ...

  5. 最大子段和(Max Sum)

    Max Sum. The following is an instance. a)    (-2,11,-4,13,-5,-2) 思路: 最大子段和:给定一个序列(元素可正可负),找出其子序列中元素和 ...

  6. 洛谷 P1992 不想兜圈的老爷爷 题解

    洛谷 P1992 不想兜圈的老爷爷 题解 题目描述 一位年过古稀的老爷爷在乡间行走 而他不想兜圈子 因为那会使他昏沉 偶然路过小A发扬助人为乐优良传统 带上地图 想知道路况是否一定使他清醒 usqwe ...

  7. Dos.ORM - 目录、介绍

    引言: Dos.ORM(原Hxj.Data)于2009年发布.2015年正式开源,该组件已在数百个成熟项目中应用,是目前国内用户量最大.最活跃.最完善的国产ORM.初期开发过程中参考了NBear与My ...

  8. php取得当前时间函数

    php取得当前时间函数文章提供了php的几种获取当前时间的函数,date,time等哦,同时告诉我如何解决时区问题哦. php获取当前时间 使用函式 date() 实现 <?php echo $ ...

  9. WebAssembly 介绍

    http://blog.csdn.net/zhangzq86/article/details/61195685 WebAssembly 的出现是不是意味着 Javascript 要完? https:/ ...

  10. C#socket编程序(三)

    private void ReceiveData() { bool keepalive = true; Socket s = clientSocket; Byte[] buffer = new Byt ...