什么是XML?
可扩展标记语言XML是一种类似于HTML或SGML的标记语言。XML 被设计用来传输和存储数据,而并非显示数据。使用XML可以方便的实现数据交换、系统配置、内容管理等。
Python中XML解析方式
- SAX(Simple API for XML ):Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,SAX解析通过流模式在解析XML的过程中触发对应的事件(start_element、char_data、end_element)并调用用户定义的回调函数来处理XML文件。
- DOM(Document Object Model):将XML数据在内存中解析成一个树,通过对树的操作来操作XML,占用内存大,解析速度较慢,优点是可以任意遍历树的节点。
- ElementTree:类似一个轻量级的DOM,具有方便友好的API,代码可用性好,速度快,消耗内存少。
因DOM需要将XML数据映射到内存中的树,效率低、耗内存。而SAX流式读取XML文件,虽然效率高、占用内存少,但需要用户实现回调函数。本文将介绍ElementTree的方式实现XML解析。
ElementTree在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是效率较高的xml.etree.cElementTree。从Python 3.3开始ElementTree模块会自动寻找可用的C库来加快速度。
示例XML数据
本文示例数据采用官方API示例中的XML文档,XML文档如下:
XML文件格式介绍
XML格式如下
<tag attrib = > text </tag> tail
- tag:标签,用于标识该元素表示哪种数据。
- text:标签中的文本字符串,可以用来存储一些数据。
- attrib:标签中的属性和属性值,用Dictionary形式保存。
- tail:保存与元素相关联的附加数据,非必须。
遍历XML各节点
使用ElementTree解析XML文件的一般流程:
- 导入ElementTree
- 解析Xml文件
- 获得根节点
- 查找或遍历根节点可以获得子节点
- 根据需要对节点进行更新、删除等操作
执行上述代码,输出结果为:
获取指定节点元素
常用的XML元素获取方式如下:
- find(nodename):在当前节点下,查找其中第一个tag为nodeName的节点。
- findall(nodename):在当前节点下,查找其中所有tag为nodeName的节点。
- iter(nodename):递归查找所有的子结点,以便查找到所有tag为nodeName的节点。
使用find 查找当前节点下第一个tag为country的节点。
执行结果如下
使用findall查找当前节点下所有tag为country的节点。
执行结果如下
使用iter查找所有节点下所有tag为neighbor的节点。
执行结果如下
更新指定的节点
假设我们想在每个国家的排名后延2位,然后增加更新状态节点,并将更新后的属性添加到rank元素,需要使用ElementTree.write()方法将更新后的 XML 文档写入文件中。
修改后的XML文件如下:
删除指定的节点
使用remove方法,移除指定的节点。如,我们想移除所有country节点下neighbor中name为Colombia或者Austria的节点,需要使用ElementTree.write()方法将更新后的 XML 文档写入文件中。
如上代码将 neighbor 中name为Colombia或者Austria的节点都被删除了,如下:
千里之行始于足下,若感兴趣就动手操作一下吧,感谢您的转发、关注支持。