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删除windows垃圾文件的方法
Jul 14 Python
Python实现新浪博客备份的方法
Apr 27 Python
Python编程中对super函数的正确理解和用法解析
Jul 02 Python
Numpy掩码式数组详解
Apr 17 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
pytorch中的自定义数据处理详解
Jan 06 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Pandas加速代码之避免使用for循环
May 30 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
php上的memcache和memcached两个pecl库
2010/03/29 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
Windows下搭建python开发环境详细步骤
2020/07/20 Python
详解Python中的文件操作
2016/08/28 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
python实现门限回归方式
2020/02/29 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
pandas按条件筛选数据的实现
2021/02/20 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
法定代表人授权委托书
2014/04/04 职场文书
大学生毕业个人总结
2015/02/15 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS