使用 ElementTree,以 Python 语言处理 XML
2007-03-29 12:11:28 来源:WEB开发网核心提示: 当然,对于像 weblog.xml 这样标准、浅显的文档,使用 ElementTree,以 Python 语言处理 XML(8),使用列表理解很容易就可以做同样的工作:清单 10. 使用列表理解查找并过滤嵌套子元素>>> for ts in [ts.text for e
当然,对于像 weblog.xml 这样标准、浅显的文档,使用列表理解很容易就可以做同样的工作:
清单 10. 使用列表理解查找并过滤嵌套子元素
>>> for ts in [ts.text for e in weblog
... for ts in e.findall('dateTime')
... if ts.text.startswith('19/Aug')]:
... print ts
然而,面向散文的 XML 文档,其文档结构往往拥有更多的变化,且嵌套标记通常有至少五或六层深。举例来说,一个 XML 模式(如 DocBook 或 TEI)可能会在节、子节、参考书目中含有引证,或者是在斜体标记、块引用中含有引证,等等。查找每个 <citation> 元素会要求涉及多个层次,进行繁琐(可能需要递归)的搜索。而使用 XPath,您只要这样写:
清单 11. 使用 XPath 查找深层嵌套子元素
>>> from elementtree import ElementTree
>>> weblog = ElementTree.parse('weblog.xml').getroot()
>>> cites = weblog.findall('.//citation')
然而, ElementTree对 XPath 的支持是有限的:您不能使用完整 XPath 所包含的各种函数,也不能按属性进行搜索。可是,在可行范围内,在 ElementTree中使用 XPath 子集可以大大提高其可读性和表达能力。
在结束本文前我还想要再提一点 ElementTree比较奇怪的地方。XML 文档可以是混合内容。尤其是面向散文的 XML 往往会任意散布 PCDATA 和标记。但是您应该在哪里正确地 存储子节点之间的文本呢?由于 ElementTree 的 Element 实例有一个单一的 .text 属性 - 包含一个字符串 - 它并不真正为断开的字符串序列保留空格。 ElementTree 采用的解决方案赋予了每个节点一个 .tail 属性,它包含了位于结束标记之后,下一元素开始或父元素结束之前所有的文本。举例来说:
Tags:使用 ElementTree Python
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接