Python存取XML的常见方法实例分析


Posted in Python onMarch 21, 2017

本文实例讲述了Python存取XML的常见方法。分享给大家供大家参考,具体如下:

目前而言,Python 3.2存取XML有以下四种方法:

1.Expat
2.DOM
3.SAX
4.ElementTree

以以下xml作为讨论依据

<?xml version="1.0" encoding="utf-8"?>
<Schools>
  <School Name="XiDian">
    <Class Id="030612">
      <Student Name="salomon">
        <Scores>
          <Math>98</Math>
          <English>85</English>
          <physics>89</physics>
        </Scores>
      </Student>
      <Student Name="Jupiter">
        <Scores>
          <Math>74</Math>
          <English>83</English>
          <physics>69</physics>
        </Scores>
      </Student>
    </Class>
    <Class Id="030611">
      <Student Name="Venus">
        <Scores>
          <Math>98</Math>
          <English>85</English>
          <physics>89</physics>
        </Scores>
      </Student>
      <Student Name="Mars">
        <Scores>
          <Math>74</Math>
          <English>83</English>
          <physics>69</physics>
        </Scores>
      </Student>
    </Class>
  </School>
</Schools>

Expat

Expat是一个面向流的解析器。您注册的解析器回调(或handler)功能,然后开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程序(如果您已经注册的一个)。该文件被输送到解析器,会被分割成多个片断,并分段装到内存中。因此expat可以解析那些巨大的文件。

SAX

SAX是个循序存取XML的解析器API,一个实现SAX的解析器(也就是“SAX Parser”)以一个串流解析器的型式作用,拥有事件驱动API。由使用者定义回调函数,解析时,若发生事件的话会被调用。事件在任一XML特性遇到时引发,以及遇到他们结尾时再次引发。XML属性也作为传给元素事件资料的一部分。SAX 处理时单方向性的;解析过的资料无法在不重新开始的情况下再次读取。

DOM

DOM解析器在任何处理开始之前,必须把整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小(相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料)。

DOM在python3.2中有两种实现方式:

1.xml.minidom是一个基本的实现。
2.xml.pulldom只在需要时构建被访问的子树。

'''
Created on 2012-5-25
@author: salomon
'''
import xml.dom.minidom as minidom
dom = minidom.parse("E:\\test.xml")
root = dom.getElementsByTagName("Schools") #The function getElementsByTagName returns NodeList.
print(root.length)
for node in root: 
  print("Root element is %s。" %node.tagName)# 格式化输出,与C系列语言有很大区别。
  schools = node.getElementsByTagName("School")
  for school in schools:
    print(school.nodeName)
    print(school.tagName)
    print(school.getAttribute("Name"))
    print(school.attributes["Name"].value)
    classes = school.getElementsByTagName("Class")
    print("There are %d classes in school %s" %(classes.length, school.getAttribute("Name")))
    for mclass in classes:
      print(mclass.getAttribute("Id"))
      for student in mclass.getElementsByTagName("Student"):
        print(student.attributes["Name"].value)
        print(student.getElementsByTagName("English")[0].nodeValue) #这个为什么啊?
        print(student.getElementsByTagName("English")[0].childNodes[0].nodeValue)
        student.getElementsByTagName("English")[0].childNodes[0].nodeValue = 75
f = open('new.xml', 'w', encoding = 'utf-8')
dom.writexml(f,encoding = 'utf-8')
f.close()

ElementTree

目前搜到的ElementTree的信息较少,目前不知道其工作机制。有资料显示ElementTree近乎一种轻量级的DOM,但是ElementTree 所有的 Element 节点的工作方式是一致的。它很类似于C#中的XpathNavigator。

'''
Created on 2012-5-25
@author: salomon
'''
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
tree.parse("E:\\test.xml")
root = tree.getroot()
print(root.tag)
print(root[0].tag)
print(root[0].attrib)
schools = root.getchildren() 
for school in schools:
  print(school.get("Name"))
  classes = school.findall("Class")
  for mclass in classes:
    print(mclass.items())
    print(mclass.keys())
    print(mclass.attrib["Id"])
    math = mclass.find("Student").find("Scores").find("Math")
    print(math.text)
    math.set("teacher", "bada")
tree.write("new.xml")

Compare:

就以上几点来说Expat和SAX解析XML方式相同,就是不知道性能相比怎样。DOM相对于以上两种解析器,消耗内存,而且由于存取耗时,所以处理文件相对来说慢。如果文件太大无法载入内存,DOM这种解析器就不能用了,但是对于,某些种类的XML验证需要存取整份文件,或者某些XML处理仅要求存取整份文件的需求时,DOM是唯一选择。

Note:

需要指出的是存取XML的这几项技术并不是Python独创的,Python也是通过借鉴其他语言或者直接从其他语言引入进来的。例如Expat就是一个用C语言开发的、用来解析XML文档的开发库。而SAX最初是由DavidMegginson采用java语言开发的,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。可以应用于任何编程语言。

做为对比我也想列举一下C#存取XML文档的方式:

1. 基于DOM的XmlDocument
2. 基于流文件的XmlReader 和 XmlWriter(它和SAX流文件实现不同,SAX是事件驱动模型)。
3. Linq to Xml

流文件两种模型:XmlReader/XMLWriter VS SAX

流模型每次迭代XML文档中的一个节点,适合于处理较大的文档,所耗内存空间小。流模型中有两种变体——“推”模型和“拉”模型。

推模型也就是常说的SAX,SAX是一种靠事件驱动的模型,也就是说:它每发现一个节点就用推模型引发一个事件,而我们必须编写这些事件的处理程序,这样的做法非常的不灵活,也很麻烦。

.NET中使用的是基于“拉”模型的实现方案,“拉”模型在遍历文档时会把感兴趣的文档部分从读取器中拉出,不需要引发事件,允许我们以编程的方式访问文档,这大大的提高了灵活性,在性能上“拉”模型可以选择性的处理节点,而SAX每发现一个节点都会通知客户机,从而,使用“拉”模型可以提高Application的整体效率。

Python 相关文章推荐
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python绘制动态水球图过程详解
Jun 03 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 Python
代码复现python目标检测yolo3详解预测
May 06 Python
Python正则简单实例分析
Mar 21 #Python
Python处理XML格式数据的方法详解
Mar 21 #Python
Python做简单的字符串匹配详解
Mar 21 #Python
Python 转义字符详细介绍
Mar 21 #Python
python 迭代器和iter()函数详解及实例
Mar 21 #Python
浅谈五大Python Web框架
Mar 20 #Python
python rsa 加密解密
Mar 20 #Python
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
php实现的漂亮分页方法
2014/04/17 PHP
php命令行用法入门实例教程
2014/10/27 PHP
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
js闭包用法实例详解
2016/12/13 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
深入理解Python异常处理的哲学
2019/02/01 Python
python、Matlab求定积分的实现
2019/11/20 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
计算机操作自荐信
2013/12/07 职场文书
社区国庆节活动方案
2014/02/05 职场文书
综合内勤岗位职责
2014/04/14 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
实习科室评语
2015/01/04 职场文书
百万英镑观后感
2015/06/09 职场文书
安全教育观后感
2015/06/17 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
python基础之while循环语句的使用
2021/04/20 Python
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技
SQL Server 中的事务介绍
2022/05/20 SQL Server