xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,
xml比较早,早期许多软件都是用xml,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
什么是XML?
XML是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。您可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。XML不是为了方便阅读而设计,而是为了编码为数据。
标记语言从早期的私有公司和政府制定形式逐渐演变成标准通用标记语言(Standard Generalized Markup Language,SGML)、超文本标记语言(Hypertext Markup Language,HTML),并且最终演变成 XML。XML有以下几个特点。
- XML的设计宗旨是传输数据,而非显示数据。
- XML标签没有被预定义。您需要自行定义标签。
- XML被设计为具有自我描述性。
- XML是W3C的推荐标准。
xml常见用途
(1) 数据传送通用格式
(2)配置文件
(3) 充当小型数据库
目前,XML在Web中起到的作用不会亚于一直作为Web基石的HTML。 XML无所不在。XML是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
因此,学会如何解析XML文件,对于Web开发来说是十分重要的。
有哪些可以解析XML的Python包?
Python的标准库中,提供了6种可以用于处理XML的包。
xml.dom 、xml.dom.minidom、xml.dom.pulldom、xml.sax、xml.parser.expat、xml.etree.ElementTree(以下简称ET)
利用ElementTree解析XML
Python标准库中,提供了ET的两种实现。一个是纯Python实现的,另一个是速度更快的C语言实现。请记住始终使用C语言实现,因为它的速度要快很多,而且内存消耗也要少很多。如果你所使用的Python版本中没有所需的加速模块,你可以这样导入模块:
如果某个API存在不同的实现,上面是常见的导入方式。当然,很可能你直接导入第一个模块时,并不会出现问题。请注意,自Python 3.3之后,就不用采用上面的导入方法,因为模块会自动优先使用C加速器,如果不存在C实现,则会使用Python实现。
因此,使用Python 3.3+的朋友,只需要即可。
将XML文档解析为树(tree)
XML是一种结构化、层级化的数据格式,最适合体现XML的数据结构就是树。ET提供了两个对象:将整个XML文档转化为树,则代表着树上的单个节点。对整个XML文档的交互(读取,写入,查找需要的元素),一般是在层面进行的。对单个XML元素及其子元素,则是在层面进行的。
ElementTree表示整个XML节点树,而Element表示节点数中的一个单独的节点。
ET 模块可以归纳为三个部分:类,类以及一些操作 XML 的函数。
在面向对象的编程语言中,我们需要定义几个类来表示这个树形结构的组成部分。分析这个树形结构我们发现其实每个节点(指的是上图中的每个圆形,对应XML中的每个标签对)都可以抽象为一个共同的类,比如叫Leaf(叶子)、Node(节点)、Element都可以。但是,除了表示节点的类,我们还需要定义一个类来表示这个树本身。ET(xml.etree.ElementTree)中就设计了以下几个类:
- ElementTree: 表示整个XML层级结构
- Element: 表示树形结构中所有的父节点
- SubElement: 表示树形结构中所有的子节点
有些节点既是父节点,又是子节点
Xml语法
入门案例: 用xml来记录一个班级信息
用encoding属性说明文档的字符编码:<?xml version="1.0" encoding="GB2312" ?>
当XML文件中有中文时,必须使用encoding属性指明文档的字符编码,例如:encoding="GB2312"或者encoding="utf-8",并且在保存文件时,也要以相应的文件编码来保存,否则在使用浏览器解析XML文件时,就会出现解析错误的情况。
(1) 文档声明
<?xml version=”1.0” encoding=”编码方式” standalone=”yes|no”?>
XML声明放在XML文档的第一行
XML声明由以下几个部分组成:
version - -文档符合XML1.0规范,我们学习1.0
encoding - -文档字符编码,比如”gb2312”
standalone - -文档定义是否独立使用
standalone="yes“
standalone=“no” 默认
(2) 一个xml 文档中,有且只有一个根元素(元素标签节点)
(3) 对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的:
不等价与
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,要特别注意。
(4) 属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔),一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">
特定的属性名称在同一个元素标记中只能出现一次,属性值不能包括<, >, &
实际效果
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
- <P>和<p>是两个不同的标记。
- 不能以数字或"_" (下划线)开头。
- 不能包含空格。
- 名称中间不能包含冒号(:)。
(5)xml语法——元素
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
(6)XML语法——属性
<input name=“text”> ,属性值一定要用双引号(")或单引号(')引起来,定义属性必须遵循与标签相同的命名规范 。
多学一招:**在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述**,例如:
例子
在python中的操作
xml文件:文件名"testxml.xml",内容如下:
python中的操作
ElementTree.parse(source, parser=None),将xml文件加载并返回ElementTree对象。parser是一个可选的参数,如果为空,则默认使用标准的XMLParser解析器。
ElementTree.getroot(),得到根节点。返回根节点的element对象。根元素(root)是一个对象。
Element.remove(tag),删除root下名称为tag的子节点 以下函数,ElementTree和Element的对象都包含。
访问Element对象的标签、属性和值
例子
输出结果
遍历根节点
例子
输出结果
例子
输出结果
root.iter()迭代
例子
输出结果
element.findall()、element.find()
输出结果
修改xml文件:
element.set()修改属性,element.remove()删除元素
- ElementTree.write("xmlfile"):更新xml文件
- Element.append():为当前element对象添加子元素(element)
- Element.set(key,value):为当前element的key属性设置value值
- Element.remove(element):删除为element的节点
例子
xml文件:文件名"testxml.xml",内容如下:
python操作
element.set()修改属性
输出结果
element.remove()删除元素
例子
test.xml 原文件内容
python文件
输出结果
创建xml文件
输出结果
datetime模块
datatime模块重新封装了time模块,提供更多接口,
相比于time模块,datetime模块的接口则更直观、更容易调用
datetime模块定义了下面这几个类:
- datetime.date:表示日期的类。常用的属性有year, month, day;
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
- datetime.datetime:表示日期时间。
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
- datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)
1、date类
datetime.date(year, month, day)
静态方法和字段
例子
输出结果
date类方法和属性
例子
输出结果
2、time类
datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] )
静态方法和字段
例子
输出结果
方法和属性
例子
输出结果
3、datetime类
datetime相当于date和time结合起来。datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
静态方法和字段
例子
输出结果
方法和属性
输出结果
4、timedelta类,时间加减
使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算,如果要计算月份则需要另外的办法。
输出结果
参考资料
http://developer.51cto.com/art/201602/505662.htm