2
2
3
3
#标准库(7)
4
4
5
- ##xml
5
+ ##XML
6
6
7
- xml在软件领域用途非常广泛 ,有名人曰:
7
+ XML在软件领域用途非常广泛 ,有名人曰:
8
8
9
9
> “当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴。有史以来第一次,这个世界拥有了一种用来结构化文档和数据的通用且适应性强的格式,它不仅仅可以用于 WEB,而且可以被用于任何地方。”
10
10
11
11
> ---《Designing With Web Standards Second Edition》, Jeffrey Zeldman
12
12
13
- 对于xml如果要做一个定义式的说明 ,就不得不引用w3school里面简洁而明快的说明:
13
+ 如果要对XML做一个定义式的说明 ,就不得不引用w3school里面简洁而明快的说明:
14
14
15
15
- XML 指可扩展标记语言(EXtensible Markup Language)
16
16
- XML 是一种标记语言,很类似 HTML
@@ -19,38 +19,38 @@ xml在软件领域用途非常广泛,有名人曰:
19
19
- XML 被设计为具有自我描述性。
20
20
- XML 是 W3C 的推荐标准
21
21
22
- 如果读者要详细了解和学习有关xml ,可以阅读[ w3school的教程] ( http://www.w3school.com.cn/xml/xml_intro.asp )
22
+ 如果读者要详细了解和学习XML ,可以阅读[ w3school的教程] ( http://www.w3school.com.cn/xml/xml_intro.asp )
23
23
24
- xml的重要,关键在于它是用来传输数据,因为传输数据, 特别是在web编程中,经常要用到的。有了这样一种东西,就让数据传输变得简单了。对于这么重要的,python当然有支持 。
24
+ XML的重要在于它是用来传输数据的,因此, 特别是在web编程中,经常要用到的。有了它让数据传输变得简单了。这么重要,Python当然支持 。
25
25
26
- 一般来讲,一个引人关注的东西,总会有很多人从不同侧面去关注 。在编程语言中也是如此,所以,对xml这个明星式的东西,python提供了多种模块来处理 。
26
+ 一般来讲,一个引人关注的东西,总会有很多人从不同侧面去研究 。在编程语言中也是如此,所以,对XML这个明星式的东西,Python提供了多种模块来处理 。
27
27
28
- - xml.dom.* 模块:Document Object Model。适合用于处理 DOM API。它能够将xml数据在内存中解析成一个树,然后通过对树的操作来操作xml 。但是,这种方式由于将xml数据映射到内存中的树 ,导致比较慢,且消耗更多内存。
29
- - xml.sax.* 模块:simple API for XML。由于SAX以流式读取xml文件 ,从而速度较快,切少占用内存,但是操作上稍复杂,需要用户实现回调函数。
28
+ - xml.dom.* 模块:Document Object Model。适合用于处理 DOM API。它能够将XML数据在内存中解析成一个树,然后通过对树的操作来操作XML 。但是,这种方式由于将XML数据映射到内存中的树 ,导致比较慢,且消耗更多内存。
29
+ - xml.sax.* 模块:simple API for XML。由于SAX以流式读取XML文件 ,从而速度较快,切少占用内存,但是操作上稍复杂,需要用户实现回调函数。
30
30
- xml.parser.expat:是一个直接的,低级一点的基于 C 的 expat 的语法分析器。 expat接口基于事件反馈,有点像 SAX 但又不太像,因为它的接口并不是完全规范于 expat 库的。
31
- - xml.etree.ElementTree (以下简称 ET):元素树。它提供了轻量级的python式的API ,相对于DOM,ET快了很多
31
+ - xml.etree.ElementTree (以下简称 ET):元素树。它提供了轻量级的Python式的API ,相对于DOM,ET快了很多
32
32
,而且有很多令人愉悦的API可以使用;相对于SAX,ET也有ET.iterparse提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,节省内存。ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。
33
33
34
- 所以,我用xml .etree.ElementTree
34
+ 所以,我用 ` xml .etree.ElementTree` 。
35
35
36
- ElementTree在标准库中有两种实现 。一种是纯Python实现:xml.etree.ElementTree ,另外一种是速度快一点:xml.etree.cElementTree 。
36
+ ` ElementTree ` 在标准库中有两种实现 。一种是纯Python实现:` xml.etree.ElementTree ` ,另外一种是速度快一点:` xml.etree.cElementTree ` 。
37
37
38
- 如果读者使用的是python2.x ,可以像这样引入模块:
38
+ 如果读者使用的是Python 2 ,可以像这样引入模块:
39
39
40
40
try:
41
41
import xml.etree.cElementTree as ET
42
42
except ImportError:
43
43
import xml.etree.ElementTree as ET
44
44
45
- 如果是Python3. 3以上,就没有这个必要了,只需要一句话` import xml.etree.ElementTree as ET ` 即可,然后由模块自动来寻找适合的方式。显然python3.x相对python2.x有了很大进步。但是,本教程碍于很多工程项目还没有升级换代,暂且忍受了 。
45
+ 如果是Python 3以上,就没有这个必要了,只需要一句话` import xml.etree.ElementTree as ET ` 即可,然后由模块自动来寻找适合的方式。显然Python 3相对Python 2有了很大进步 。
46
46
47
47
###遍历查询
48
48
49
- 先要搞一个xml文档。为了图省事,我就用w3school中的一个例子 :
49
+ 先要做一个XML文档。图省事,就用w3school中的一个例子 :
50
50
51
51
![ ] ( ./2images/22601.jpg )
52
52
53
- 这是一个xml树,只不过是用图来表示的,还没有用ET解析呢。把这棵树写成xml文档格式 :
53
+ 这是一棵树,先把这棵树写成XML文档格式 :
54
54
55
55
<bookstore>
56
56
<book category="COOKING">
@@ -73,19 +73,19 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
73
73
</book>
74
74
</bookstore>
75
75
76
- 将xml保存为名为22601 .xml的文件,然后对其进行如下操作:
76
+ 将其保存并命名为22601 .xml的文件,接下来就是以它为对象,练习各种招数了。
77
77
78
- >>> import xml.etree.cElementTree as ET
78
+ >>> import xml.etree.ElementTree as ET
79
79
80
- 为了简化,我用这种方式引入,如果在编程实践中,推荐读者使用try ...except...方式 。
80
+ 如果读者使用Python 2,推荐使用如前所述的 ` try ...except...` 方式引入模块;如果是Python 3,按照刚才的方式引入即可 。
81
81
82
82
>>> tree = ET.ElementTree(file="22601.xml")
83
83
>>> tree
84
84
<ElementTree object at 0xb724cc2c>
85
85
86
- 建立起xml解析树。然后可以通过根节点向下开始读取各个元素 (element对象)。
86
+ 建立起XML解析树对象。然后通过根节点向下开始读取各个元素 (element对象)。
87
87
88
- 在上述xml文档中 ,根元素是<bookstore >,它没有属性,或者属性为空。
88
+ 在上述XML文档中 ,根元素是<bookstore >,它没有属性,或者属性为空。
89
89
90
90
>>> root = tree.getroot() #获得根
91
91
>>> root.tag
@@ -96,7 +96,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
96
96
要想将根下面的元素都读出来,可以:
97
97
98
98
>>> for child in root:
99
- ... print child.tag, child.attrib
99
+ ... print child.tag, child.attrib #Python 3: print(child.tag, child.attrib)
100
100
...
101
101
book {'category': 'COOKING'}
102
102
book {'category': 'CHILDREN'}
@@ -111,7 +111,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
111
111
>>> root[0].text #无内容
112
112
'\n '
113
113
114
- 再深点,就有感觉了 :
114
+ 再深入一层,就有内容了 :
115
115
116
116
>>> root[0][0].tag
117
117
'title'
@@ -120,17 +120,17 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
120
120
>>> root[0][0].text
121
121
'Everyday Italian'
122
122
123
- 对于ElementTree对象,有一个iter方法可以对指定名称的子节点进行深度优先遍历 。例如:
123
+ 对于ElementTree对象,有一个 ` iter() ` 方法可以对指定名称的子节点进行深度优先遍历 。例如:
124
124
125
125
>>> for ele in tree.iter(tag="book"): #遍历名称为book的节点
126
- ... print ele.tag, ele.attrib
126
+ ... print ele.tag, ele.attrib #Python 3: print(ele.tag, ele.attrib)
127
127
...
128
128
book {'category': 'COOKING'}
129
129
book {'category': 'CHILDREN'}
130
130
book {'category': 'WEB'}
131
131
132
132
>>> for ele in tree.iter(tag="title"): #遍历名称为title的节点
133
- ... print ele.tag, ele.attrib, ele.text
133
+ ... print ele.tag, ele.attrib, ele.text #Python 3: print(ele.tag, ele.attrib, ele.text)
134
134
...
135
135
title {'lang': 'en'} Everyday Italian
136
136
title {'lang': 'en'} Harry Potter
@@ -139,7 +139,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
139
139
如果不指定元素名称,就是将所有的元素遍历一边。
140
140
141
141
>>> for ele in tree.iter():
142
- ... print ele.tag, ele.attrib
142
+ ... print ele.tag, ele.attrib #Python 3: print(ele.tag, ele.attrib)
143
143
...
144
144
bookstore {}
145
145
book {'category': 'COOKING'}
@@ -158,43 +158,43 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
158
158
year {}
159
159
price {}
160
160
161
- 除了上面的方法,还可以通过路径,搜索到指定的元素, 读取其内容。 这就是xpath。此处对xpath不详解,如果要了解可以到网上搜索有关信息。
161
+ 除了上面的方法,还可以通过路径搜索到指定的元素, 读取其内容, 这就是xpath。此处对xpath不详解,如果要了解可以到网上搜索有关信息。
162
162
163
163
>>> for ele in tree.iterfind("book/title"):
164
- ... print ele.text
164
+ ... print ele.text #Python 3: print(ele.text)
165
165
...
166
166
Everyday Italian
167
167
Harry Potter
168
168
Learning XML
169
169
170
- 利用findall() 方法,也可以是实现查找功能:
170
+ 利用 ` findall() ` 方法,也可以是实现查找功能:
171
171
172
172
>>> for ele in tree.findall("book"):
173
173
... title = ele.find('title').text
174
174
... price = ele.find('price').text
175
175
... lang = ele.find('title').attrib
176
- ... print title, price, lang
176
+ ... print title, price, lang #Python 3: print(title, price, lang)
177
177
...
178
178
Everyday Italian 30.00 {'lang': 'en'}
179
179
Harry Potter 29.99 {'lang': 'en'}
180
180
Learning XML 39.95 {'lang': 'en'}
181
181
182
182
###编辑
183
183
184
- 除了读取有关数据之外,还能对xml进行编辑,即增删改查功能。还是以上面的xml文档为例 :
184
+ 除了读取有关数据之外,还能对XML进行编辑,即增、删、改、查功能。还是以上面的XML文档为例 :
185
185
186
186
>>> root[1].tag
187
187
'book'
188
188
>>> del root[1]
189
189
>>> for ele in root:
190
- ... print ele.tag
190
+ ... print ele.tag #Python 3: print(ele.tag)
191
191
...
192
192
book
193
193
book
194
194
195
195
如此,成功删除了一个节点。原来有三个book节点,现在就还剩两个了。打开源文件再看看,是不是正好少了第二个节点呢?一定很让你失望,源文件居然没有变化。
196
196
197
- 的确如此,源文件没有变化,这就对了。 因为至此的修改动作,还是停留在内存中,还没有将修改结果输出到文件。不要忘记,我们是在内存中建立的ElementTree对象。再这样做:
197
+ 的确如此,源文件没有变化,因为至此的修改动作,还是停留在内存中,还没有将修改结果输出到文件。不要忘记,我们是在内存中建立的ElementTree对象。再这样做:
198
198
199
199
>>> import os
200
200
>>> outpath = os.getcwd()
@@ -209,7 +209,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
209
209
除了删除,也能够修改:
210
210
211
211
>>> for price in root.iter("price"): #原来每本书的价格
212
- ... print price.text
212
+ ... print price.text #Python 3: print(pice.text)
213
213
...
214
214
30.00
215
215
39.95
@@ -239,7 +239,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
239
239
240
240
不仅价格修改了,而且在price标签里面增加了属性标记。干得不错。
241
241
242
- 上面用` del ` 来删除某个元素,其实,在编程中,这个用的不多,更喜欢用remove() 方法。比如我要删除` price > 40 ` 的书。可以这么做:
242
+ 上面用` del ` 来删除某个元素,其实,在编程中用的不多,更喜欢用 ` remove() ` 方法。比如我要删除` price > 40 ` 的书。可以这么做:
243
243
244
244
>>> for book in root.findall("book"):
245
245
... price = book.find("price").text
@@ -261,13 +261,13 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
261
261
262
262
接下来就要增加元素了。
263
263
264
- >>> import xml.etree.cElementTree as ET
264
+ >>> import xml.etree.ElementTree as ET
265
265
>>> tree = ET.ElementTree(file="22601.xml")
266
266
>>> root = tree.getroot()
267
267
>>> ET.SubElement(root, "book") #在root里面添加book节点
268
268
<Element 'book' at 0xb71c7578>
269
269
>>> for ele in root:
270
- ... print ele.tag
270
+ ... print ele.tag #Python 3: print(ele.tag)
271
271
...
272
272
book
273
273
book
@@ -336,9 +336,9 @@ ET里面的属性和方法不少,这里列出常用的,供使用中备查。
336
336
337
337
最后,提供一个参考,这是一篇来自网络的文章:[ Python xml属性、节点、文本的增删改] ( http://blog.csdn.net/wklken/article/details/7603071 ) ,本文的源码我也复制到下面,请读者参考:
338
338
339
- > 实现思想:
339
+ 实现思想:
340
340
341
- > 使用ElementTree,先将文件读入,解析成树,之后,根据路径,可以定位到树的每个节点,再对节点进行修改,最后直接将其输出.
341
+ 使用ElementTree,先将文件读入,解析成树,之后,根据路径,可以定位到树的每个节点,再对节点进行修改,最后直接将其输出.
342
342
343
343
#!/usr/bin/python
344
344
# -*- coding=utf-8 -*-
0 commit comments