特别注明:本文所使用的例子均来自于Python软件内置文档中“20.5. xml.etree.ElementTree — The ElementTree XML API”一节。
思考1:ElementTree class和Element class有何区别?
20.5.1.1节的首段就对这两个类做了说明,其实我先开始并没有特别注意到这两个类,但是在使用中发现竟然会有两个类,脑海中突然冒出一个问题——ElementTree class和Element class有何区别?
"ET has two classes for this purpose - ElementTreerepresents the whole XML document as a tree, andElementrepresents a single node in this tree. Interactions with the whole document (reading and writing to/from files) are usually done on the ElementTree level. Interactions with a single XML element and its sub-elements are done on the Element level."
挺佩服写文章的作者,将这个问题的答案写在了第一段,我猜测他在使用xml.etree.ElementTree的时候也曾经遇到过这个问题,这是一个最基本的问题,当然也是我们首先要了解的一个知识点。
思考2:使用xml.etree.ElementTree.fromstring()方法的时候遇到一个看似简单却很容易出错的问题
字符串中保存着一组xml代码,可以直接使用fromstring(text)。特别要注意的是,三引号(''')后面要紧跟跟xml代码,不能有回车。
错误用法(三引号后面有回车)
# 这是错误用法!!!
country_data_as_string = '''
1
2008
141100
4
2011
59900
68
2011
13600
'''
import xml.etree.ElementTree as ET
root = ET.fromstring(country_data_as_string)
此时会有如下报错提示,说明得很清楚,“XML or text declaration not at start of entity”:
Traceback (most recent call last):
File "", line 1, in
root = ET.fromstring(country_data_as_string)
File "C:\Users\cherish\AppData\Local\Programs\Python\Python36-32\lib\xml\etree\ElementTree.py", line 1314, in XML
parser.feed(text)
File "", line None
xml.etree.ElementTree.ParseError: XML or text declaration not at start of entity: line 2, column 0
正确用法(三引号后紧跟xml代码)
# 这是正确用法!!!
country_data_as_string = '''<?xml version="1.0"?>
1
2008
141100
4
2011
59900
68
2011
13600
'''
import xml.etree.ElementTree as ET
root = ET.fromstring(country_data_as_string)
思考3:Element Objects中iter(tag=None)方法会遍历当前节点下的所有子节点、孙节点等等
在Element Objects所有方法中,只有iter()是从当前节点开始遍历其下的所有子节点、孙节点、重孙节点等等一直进行下去。诸如find()、findall()、甚至是iterfind()都只能遍历子节点(subelement)。正如文档中对iter()方法的描述中最重要的一句——The iterator iterates over this element and all elements below it, in document (depth first) order。
另外,20.5.1.4. Finding interesting elements一节也说明了iter()与findall()的区别。
Element has some useful methods that help iterate recursively over all the sub-tree below it (its children, their children, and so on). For example,
Element.findall() finds only elements with a tag which are direct children of the current element. Element.find() finds the first child with a particular tag
思考4:拿到一个xml文档后如何快速处理数据
主要是两步:
1. 从xml文档中读取数据——使用parse()方法,此时返回
2. 获取根节点——使用getroot()方法,此时返回
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml') # step1
root = tree.getroot() # step2
假设country_data.xml文档中的内容如下,执行完第二步后root就指向data节点,然后就可以根据自己的需求进行数据处理了。
1
2008
141100
4
2011
59900
68
2011
13600