branch {'name': 'invalid'}
-
>>> root[0].tag, root[0].text
-
('branch', 'n text,sourcen ')
查找需要的元素从上面的示例中,可以明显发现我们能够通过简单的递归方法(对每一个元素,递归式访问其所有子元素)获取树中的所有元素 。但是,由于这是十分常见的工作,ET提供了一些简便的实现方法 。
Element
对象有一个iter
方法,可以对某个元素对象之下所有的子元素进行深度优先遍历(DFS) 。ElementTree
对象同样也有这个方法 。下面是查找XML文档中所有元素的最简单方法:-
>>> for elem in tree.iter:
-
... print elem.tag, elem.attrib
-
...
-
doc {}
-
branch {'hash': '1cdf045c', 'name': 'codingpy.com'}
-
branch {'hash': 'f200013e', 'name': 'release01'}
-
sub-branch {'name': 'subrelease01'}
-
branch {'name': 'invalid'}
iter
方法可以接受tag名称,然后遍历所有具备所提供tag的元素:-
>>> for elem in tree.iter(tag='branch'):
-
... print elem.tag, elem.attrib
-
...
-
branch {'hash': '1cdf045c', 'name': 'codingpy.com'}
-
branch {'hash': 'f200013e', 'name': 'release01'}
-
branch {'name': 'invalid'}
支持通过XPath查找元素使用XPath查找感兴趣的元素,更加方便 。
Element
对象中有一些find
方法可以接受Xpath路径作为参数,find
方法会返回第一个匹配的子元素,findall
以列表的形式返回所有匹配的子元素,iterfind
则返回一个所有匹配元素的迭代器(iterator) 。ElementTree
对象也具备这些方法,相应地它的查找是从根节点开始的 。下面是一个使用XPath查找元素的示例:
-
>>> for elem in tree.iterfind('branch/sub-branch'):
-
... print elem.tag, elem.attrib
-
...
-
sub-branch {'name': 'subrelease01'}
branch
元素之下所有tag为sub-branch
的元素 。接下来查找所有具备某个name
属性的branch
元素:-
>>> for elem in tree.iterfind('branch[@name="release01"]'):
-
... print elem.tag, elem.attrib
-
...
-
branch {'hash': 'f200013e', 'name': 'release01'}
构建XML文档利用ET,很容易就可以完成XML文档构建,并写入保存为文件 。
ElementTree
对象的write
方法就可以实现这个需求 。一般来说,有两种主要使用场景 。一是你先读取一个XML文档,进行修改,然后再将修改写入文档,二是从头创建一个新XML文档 。
修改文档的话,可以通过调整
Element
对象来实现 。请看下面的例子:-
>>> root = tree.getroot
-
>>> del root[2]
-
>>> root[0].set('foo', 'bar')
-
>>> for subelem in root:
-
... print subelem.tag, subelem.attrib
-
...
-
branch {'foo': 'bar', 'hash': '1cdf045c', 'name': 'codingpy.com'}
-
branch {'hash': 'f200013e', 'name': 'release01'}
推荐阅读
- 浅谈Python深浅拷贝
- 源码 用python一天爬取20万条企业信息
- 浏览器 1 秒变身 Python 编辑器
- 高效利用Python内置的数据结构
- python 文本处理
- 用Python抢火车票的简单小程序
- 机器学习10种经典算法的Python实现
- 用Python构建深度学习应用
- 高考材料作文新题解析及范文 高考材料作文
- java程序运行原理解析