WEB开发网
开发学院软件开发Python 使用 ElementTree,以 Python 语言处理 XML 阅读

使用 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 属性,它包含了位于结束标记之后,下一元素开始或父元素结束之前所有的文本。举例来说:

上一页  3 4 5 6 7 8 9  下一页

Tags:使用 ElementTree Python

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接