返回介绍

建议43:一般情况使用 ElementTree 解析 XML

发布于 2024-01-30 22:19:09 字数 3735 浏览 0 评论 0 收藏 0

xml.dom.minidom和xml.sax大概是Python中解析XML文件最广为人知的两个模块了,原因一是这两个模块自Python 2.0以来就成为Python的标准库;二是网上关于这两个模块的使用方面的资料最多。作为主要解析XML方法的两种实现,DOM需要将整个XML文件加载到内存中并解析为一棵树,虽然使用较为简单,但占用内存较多,性能方面不占优势,并且不够Pythonic;而SAX是基于事件驱动的,虽不需要全部装入XML文件,但其处理过程却较为复杂。实际上Python中对XML的处理还有更好的选择,ElementTree便是其中一个,一般情况下使用ElementTree便已足够。它从Python2.5开始成为标准模块,cElementTree是ElementTree的Cython实现,速度更快,消耗内存更少,性能上更占优势,在实际使用过程中应该尽量优先使用cElementTree。由于两者使用方式上完全兼容本文将两者看做一个物件,除非说明不再刻意区分。ElementTree在解析XML文件上具有以下特性:

使用简单。它将整个XML文件以树的形式展示,每一个元素的属性以字典的形式表示,非常方便处理。

内存上消耗明显低于DOM解析。由于ElementTree底层进行了一定的优化,并且它的iterparse解析工具支持SAX事件驱动,能够以迭代的形式返回XML部分数据结构,从而避免将整个XML文件加载到内存中,因此性能上更优化,相比于SAX使用起来更为简单明了。

支持XPath查询,非常方便获取任意节点的值。

这里需要说明的是,一般情况指的是:XML文件大小适中,对性能要求并非非常严格。如果在实际过程中需要处理的XML文件大小在GB或近似GB级别,第三方模块lxml会获得较优的处理结果。关于lxml模块的介绍请参考本章后续小节或者参考文章“使用由Python编写的lxml实现高性能XML解析”,可通过链接http://www.ibm.com/developerworks/cn/xml/x-hiperfparse/可以访问。

下面结合具体的实例来说明elementtree解析XML文件常用的方法。需要解析的XML实例如下:

<systems>
     <system platform="linux" name="linuxtest">
         <purpose>automation test</purpose>
         <system_type>virtual</system_type>
         <ip_address/>
         <commands_on_boot>
               <command_details>
                   <!-- Set root password. -->
                   <command>echo root:mytestpwd | sudo /usr/
                     sbin/chpasswd</command>
                   <userid>root2</userid>
                   <password>Passw0rd</password>
               </command_details>   
               <command_details>
                   <command>mkdir /TEST; chmod 777 /TEST</command>
               </command_details>
         </commands_on_boot>
     </system>
         <system platform="aix" name="aixtest">
         <purpose>manual test</purpose>
         <system_type>virtual</system_type>
         <ip_address/>
         <commands_on_boot>
               <command_details>
                   <!-- Set root password. -->
                   <command>echo root:mytestpwd | sudo /usr/
                     sbin/chpasswd</command>
                   <userid>root2</userid>
                   <password>Passw0rd</password>
               </command_details>   
               <command_details>
                   <command>mkdir /TEST; chmod 777 /TEST</command>
               </command_details>
         </commands_on_boot>
     </system>
</systems>

模块ElementTree主要存在两种类型ElementTree和Element,它们支持的方法以及对应的使用示例如表4-1和表4-2所示。

表4-1 ElementTree主要的方法和使用示例

表4-2 Element主要的方法和使用示例

前面我们提到elementree的iterparse工具能够避免将整个XML文件加载到内存,从而解决当读入文件过大内存而消耗过多的问题。iterparse返回一个可以迭代的由元组(时间,元素)组成的流对象,支持两个参数——source和events,其中event有4种选择——start、end、startns和endns(默认为end),分别与SAX解析的startElement、endElement、startElementNS和endElementNS一一对应。

本节最后来看一下iterparse的使用示例:统计userid在整个XML出现的次数。

>>> count = 0
>>> for event,elem in ET.iterparse("test.xml"):#
对iterparse
的返回值进行迭代
...   if event =='end':
...       if elem.tag =='userid':
...           count+=1
...   elem.clear()
...
>>> print count
2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文