-
>>> import sys
-
>>> tree.write(sys.stdout)
-
<doc>
-
<branch foo="bar" hash="1cdf045c" name="codingpy.com">
-
text,source
-
</branch>
-
<branch hash="f200013e" name="release01">
-
<sub-branch name="subrelease01">
-
xml,sgml
-
</sub-branch>
-
</branch>
-
</doc>
从头构建一个完整的文档也很容易 。ET模块提供了一个
SubElement
工厂函数,让创建元素的过程变得很简单:-
>>> a = ET.Element('elem')
-
>>> c = ET.SubElement(a, 'child1')
-
>>> c.text = "some text"
-
>>> d = ET.SubElement(a, 'child2')
-
>>> b = ET.Element('elem_b')
-
>>> root = ET.Element('root')
-
>>> root.extend((a, b))
-
>>> tree = ET.ElementTree(root)
-
>>> tree.write(sys.stdout)
-
<root><elem><child1>some text</child1><child2 /></elem><elem_b /></root>
利用
iterparse
解析XML流XML文档通常都会比较大,如何直接将文档读入内存的话,那么进行解析时就会出现问题 。这也就是为什么不建议使用DOM,而是SAX API的理由之一 。我们上面谈到,ET可以将XML文档加载为保存在内存里的树(in-memory tree),然后再进行处理 。但是在解析大文件时,这应该也会出现和DOM一样的内存消耗大的问题吧?没错,的确有这个问题 。为了解决这个问题,ET提供了一个类似SAX的特殊工具——
iterparse
,可以循序地解析XML 。接下来,笔者为大家展示如何使用
iterparse
,并与标准的树解析方式进行对比 。我们使用一个自动生成的XML文档,下面是该文档的开头部分:-
<?xml version="1.0" standalone="yes"?>
-
<site>
-
<regions>
-
<africa>
-
<item id="item0">
-
<location>United States</location> <!-- Counting locations -->
-
<quantity>1</quantity>
-
<name>duteous nine eighteen </name>
-
<payment>Creditcard</payment>
-
<description>
-
<parlist>
-
[...]
ET.parse
的标准方法:-
tree = ET.parse(sys.argv[2])
-
count = 0
-
for elem in tree.iter(tag='location'):
-
if elem.text == 'Zimbabwe':
-
count += 1
-
print count
请注意,我们其实不需要讲整个树加载到内存里 。只要检测出文本为相应值得location元素即可 。其他数据都可以废弃 。这时,我们就可以用上iterparse方法了:
-
count = 0
-
for event, elem in ET.iterparse(sys.argv[2]):
-
if event == 'end':
-
if elem.tag == 'location' and elem.text == 'Zimbabwe':
-
count += 1
-
elem.clear # 将元素废弃
-
print count
推荐阅读
- 浅谈Python深浅拷贝
- 源码 用python一天爬取20万条企业信息
- 浏览器 1 秒变身 Python 编辑器
- 高效利用Python内置的数据结构
- python 文本处理
- 用Python抢火车票的简单小程序
- 机器学习10种经典算法的Python实现
- 用Python构建深度学习应用
- 高考材料作文新题解析及范文 高考材料作文
- java程序运行原理解析