22
33#标准库(7)
44
5- ##xml
5+ ##XML
66
7- xml在软件领域用途非常广泛 ,有名人曰:
7+ XML在软件领域用途非常广泛 ,有名人曰:
88
99> “当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴。有史以来第一次,这个世界拥有了一种用来结构化文档和数据的通用且适应性强的格式,它不仅仅可以用于 WEB,而且可以被用于任何地方。”
1010
1111> ---《Designing With Web Standards Second Edition》, Jeffrey Zeldman
1212
13- 对于xml如果要做一个定义式的说明 ,就不得不引用w3school里面简洁而明快的说明:
13+ 如果要对XML做一个定义式的说明 ,就不得不引用w3school里面简洁而明快的说明:
1414
1515- XML 指可扩展标记语言(EXtensible Markup Language)
1616- XML 是一种标记语言,很类似 HTML
@@ -19,38 +19,38 @@ xml在软件领域用途非常广泛,有名人曰:
1919- XML 被设计为具有自我描述性。
2020- XML 是 W3C 的推荐标准
2121
22- 如果读者要详细了解和学习有关xml ,可以阅读[ w3school的教程] ( http://www.w3school.com.cn/xml/xml_intro.asp )
22+ 如果读者要详细了解和学习XML ,可以阅读[ w3school的教程] ( http://www.w3school.com.cn/xml/xml_intro.asp )
2323
24- xml的重要,关键在于它是用来传输数据,因为传输数据, 特别是在web编程中,经常要用到的。有了这样一种东西,就让数据传输变得简单了。对于这么重要的,python当然有支持 。
24+ XML的重要在于它是用来传输数据的,因此, 特别是在web编程中,经常要用到的。有了它让数据传输变得简单了。这么重要,Python当然支持 。
2525
26- 一般来讲,一个引人关注的东西,总会有很多人从不同侧面去关注 。在编程语言中也是如此,所以,对xml这个明星式的东西,python提供了多种模块来处理 。
26+ 一般来讲,一个引人关注的东西,总会有很多人从不同侧面去研究 。在编程语言中也是如此,所以,对XML这个明星式的东西,Python提供了多种模块来处理 。
2727
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文件 ,从而速度较快,切少占用内存,但是操作上稍复杂,需要用户实现回调函数。
3030- 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快了很多
3232,而且有很多令人愉悦的API可以使用;相对于SAX,ET也有ET.iterparse提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,节省内存。ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。
3333
34- 所以,我用xml .etree.ElementTree
34+ 所以,我用 ` xml .etree.ElementTree` 。
3535
36- ElementTree在标准库中有两种实现 。一种是纯Python实现:xml.etree.ElementTree ,另外一种是速度快一点:xml.etree.cElementTree 。
36+ ` ElementTree ` 在标准库中有两种实现 。一种是纯Python实现:` xml.etree.ElementTree ` ,另外一种是速度快一点:` xml.etree.cElementTree ` 。
3737
38- 如果读者使用的是python2.x ,可以像这样引入模块:
38+ 如果读者使用的是Python 2 ,可以像这样引入模块:
3939
4040 try:
4141 import xml.etree.cElementTree as ET
4242 except ImportError:
4343 import xml.etree.ElementTree as ET
4444
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有了很大进步 。
4646
4747###遍历查询
4848
49- 先要搞一个xml文档。为了图省事,我就用w3school中的一个例子 :
49+ 先要做一个XML文档。图省事,就用w3school中的一个例子 :
5050
5151![ ] ( ./2images/22601.jpg )
5252
53- 这是一个xml树,只不过是用图来表示的,还没有用ET解析呢。把这棵树写成xml文档格式 :
53+ 这是一棵树,先把这棵树写成XML文档格式 :
5454
5555 <bookstore>
5656 <book category="COOKING">
@@ -73,19 +73,19 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
7373 </book>
7474 </bookstore>
7575
76- 将xml保存为名为22601 .xml的文件,然后对其进行如下操作:
76+ 将其保存并命名为22601 .xml的文件,接下来就是以它为对象,练习各种招数了。
7777
78- >>> import xml.etree.cElementTree as ET
78+ >>> import xml.etree.ElementTree as ET
7979
80- 为了简化,我用这种方式引入,如果在编程实践中,推荐读者使用try ...except...方式 。
80+ 如果读者使用Python 2,推荐使用如前所述的 ` try ...except...` 方式引入模块;如果是Python 3,按照刚才的方式引入即可 。
8181
8282 >>> tree = ET.ElementTree(file="22601.xml")
8383 >>> tree
8484 <ElementTree object at 0xb724cc2c>
8585
86- 建立起xml解析树。然后可以通过根节点向下开始读取各个元素 (element对象)。
86+ 建立起XML解析树对象。然后通过根节点向下开始读取各个元素 (element对象)。
8787
88- 在上述xml文档中 ,根元素是<bookstore >,它没有属性,或者属性为空。
88+ 在上述XML文档中 ,根元素是<bookstore >,它没有属性,或者属性为空。
8989
9090 >>> root = tree.getroot() #获得根
9191 >>> root.tag
@@ -96,7 +96,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
9696要想将根下面的元素都读出来,可以:
9797
9898 >>> for child in root:
99- ... print child.tag, child.attrib
99+ ... print child.tag, child.attrib #Python 3: print(child.tag, child.attrib)
100100 ...
101101 book {'category': 'COOKING'}
102102 book {'category': 'CHILDREN'}
@@ -111,7 +111,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
111111 >>> root[0].text #无内容
112112 '\n '
113113
114- 再深点,就有感觉了 :
114+ 再深入一层,就有内容了 :
115115
116116 >>> root[0][0].tag
117117 'title'
@@ -120,17 +120,17 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
120120 >>> root[0][0].text
121121 'Everyday Italian'
122122
123- 对于ElementTree对象,有一个iter方法可以对指定名称的子节点进行深度优先遍历 。例如:
123+ 对于ElementTree对象,有一个 ` iter() ` 方法可以对指定名称的子节点进行深度优先遍历 。例如:
124124
125125 >>> 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)
127127 ...
128128 book {'category': 'COOKING'}
129129 book {'category': 'CHILDREN'}
130130 book {'category': 'WEB'}
131131
132132 >>> 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)
134134 ...
135135 title {'lang': 'en'} Everyday Italian
136136 title {'lang': 'en'} Harry Potter
@@ -139,7 +139,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
139139如果不指定元素名称,就是将所有的元素遍历一边。
140140
141141 >>> for ele in tree.iter():
142- ... print ele.tag, ele.attrib
142+ ... print ele.tag, ele.attrib #Python 3: print(ele.tag, ele.attrib)
143143 ...
144144 bookstore {}
145145 book {'category': 'COOKING'}
@@ -158,43 +158,43 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
158158 year {}
159159 price {}
160160
161- 除了上面的方法,还可以通过路径,搜索到指定的元素, 读取其内容。 这就是xpath。此处对xpath不详解,如果要了解可以到网上搜索有关信息。
161+ 除了上面的方法,还可以通过路径搜索到指定的元素, 读取其内容, 这就是xpath。此处对xpath不详解,如果要了解可以到网上搜索有关信息。
162162
163163 >>> for ele in tree.iterfind("book/title"):
164- ... print ele.text
164+ ... print ele.text #Python 3: print(ele.text)
165165 ...
166166 Everyday Italian
167167 Harry Potter
168168 Learning XML
169169
170- 利用findall() 方法,也可以是实现查找功能:
170+ 利用 ` findall() ` 方法,也可以是实现查找功能:
171171
172172 >>> for ele in tree.findall("book"):
173173 ... title = ele.find('title').text
174174 ... price = ele.find('price').text
175175 ... lang = ele.find('title').attrib
176- ... print title, price, lang
176+ ... print title, price, lang #Python 3: print(title, price, lang)
177177 ...
178178 Everyday Italian 30.00 {'lang': 'en'}
179179 Harry Potter 29.99 {'lang': 'en'}
180180 Learning XML 39.95 {'lang': 'en'}
181181
182182###编辑
183183
184- 除了读取有关数据之外,还能对xml进行编辑,即增删改查功能。还是以上面的xml文档为例 :
184+ 除了读取有关数据之外,还能对XML进行编辑,即增、删、改、查功能。还是以上面的XML文档为例 :
185185
186186 >>> root[1].tag
187187 'book'
188188 >>> del root[1]
189189 >>> for ele in root:
190- ... print ele.tag
190+ ... print ele.tag #Python 3: print(ele.tag)
191191 ...
192192 book
193193 book
194194
195195如此,成功删除了一个节点。原来有三个book节点,现在就还剩两个了。打开源文件再看看,是不是正好少了第二个节点呢?一定很让你失望,源文件居然没有变化。
196196
197- 的确如此,源文件没有变化,这就对了。 因为至此的修改动作,还是停留在内存中,还没有将修改结果输出到文件。不要忘记,我们是在内存中建立的ElementTree对象。再这样做:
197+ 的确如此,源文件没有变化,因为至此的修改动作,还是停留在内存中,还没有将修改结果输出到文件。不要忘记,我们是在内存中建立的ElementTree对象。再这样做:
198198
199199 >>> import os
200200 >>> outpath = os.getcwd()
@@ -209,7 +209,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
209209除了删除,也能够修改:
210210
211211 >>> for price in root.iter("price"): #原来每本书的价格
212- ... print price.text
212+ ... print price.text #Python 3: print(pice.text)
213213 ...
214214 30.00
215215 39.95
@@ -239,7 +239,7 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
239239
240240不仅价格修改了,而且在price标签里面增加了属性标记。干得不错。
241241
242- 上面用` del ` 来删除某个元素,其实,在编程中,这个用的不多,更喜欢用remove() 方法。比如我要删除` price > 40 ` 的书。可以这么做:
242+ 上面用` del ` 来删除某个元素,其实,在编程中用的不多,更喜欢用 ` remove() ` 方法。比如我要删除` price > 40 ` 的书。可以这么做:
243243
244244 >>> for book in root.findall("book"):
245245 ... price = book.find("price").text
@@ -261,13 +261,13 @@ ElementTree在标准库中有两种实现。一种是纯Python实现:xml.etree
261261
262262接下来就要增加元素了。
263263
264- >>> import xml.etree.cElementTree as ET
264+ >>> import xml.etree.ElementTree as ET
265265 >>> tree = ET.ElementTree(file="22601.xml")
266266 >>> root = tree.getroot()
267267 >>> ET.SubElement(root, "book") #在root里面添加book节点
268268 <Element 'book' at 0xb71c7578>
269269 >>> for ele in root:
270- ... print ele.tag
270+ ... print ele.tag #Python 3: print(ele.tag)
271271 ...
272272 book
273273 book
@@ -336,9 +336,9 @@ ET里面的属性和方法不少,这里列出常用的,供使用中备查。
336336
337337最后,提供一个参考,这是一篇来自网络的文章:[ Python xml属性、节点、文本的增删改] ( http://blog.csdn.net/wklken/article/details/7603071 ) ,本文的源码我也复制到下面,请读者参考:
338338
339- > 实现思想:
339+ 实现思想:
340340
341- > 使用ElementTree,先将文件读入,解析成树,之后,根据路径,可以定位到树的每个节点,再对节点进行修改,最后直接将其输出.
341+ 使用ElementTree,先将文件读入,解析成树,之后,根据路径,可以定位到树的每个节点,再对节点进行修改,最后直接将其输出.
342342
343343 #!/usr/bin/python
344344 # -*- coding=utf-8 -*-
0 commit comments