1. <?xml version="1.0" encoding="utf-8"?>
  2. <Schools>
  3. <School Name="XiDian">
  4. <Class Id="">
  5. <Student Name="salomon">
  6. <Scores>
  7. <Math></Math>
  8. <English></English>
  9. <physics></physics>
  10. </Scores>
  11. </Student>
  12. <Student Name="Jupiter">
  13. <Scores>
  14. <Math></Math>
  15. <English></English>
  16. <physics></physics>
  17. </Scores>
  18. </Student>
  19. </Class>
  20. <Class Id="">
  21. <Student Name="Venus">
  22. <Scores>
  23. <Math></Math>
  24. <English></English>
  25. <physics></physics>
  26. </Scores>
  27. </Student>
  28. <Student Name="Mars">
  29. <Scores>
  30. <Math></Math>
  31. <English></English>
  32. <physics></physics>
  33. </Scores>
  34. </Student>
  35. </Class>
  36. </School>
  37. </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只在需要时构建被访问的子树。

  1. '''
  2. Created on --
  3.  
  4. @author: salomon
  5. '''
  6.  
  7. import xml.dom.minidom as minidom
  8.  
  9. dom = minidom.parse("E:\\test.xml")
  10. root = dom.getElementsByTagName("Schools") #The function getElementsByTagName returns NodeList.
  11. print(root.length)
  12.  
  13. for node in root:
  14. print("Root element is %s。" %node.tagName)# 格式化输出,与C系列语言有很大区别。
  15. schools = node.getElementsByTagName("School")
  16. for school in schools:
  17. print(school.nodeName)
  18. print(school.tagName)
  19. print(school.getAttribute("Name"))
  20. print(school.attributes["Name"].value)
  21. classes = school.getElementsByTagName("Class")
  22. print("There are %d classes in school %s" %(classes.length, school.getAttribute("Name")))
  23. for mclass in classes:
  24. print(mclass.getAttribute("Id"))
  25. for student in mclass.getElementsByTagName("Student"):
  26. print(student.attributes["Name"].value)
  27. print(student.getElementsByTagName("English")[].nodeValue) #这个为什么啊?
  28. print(student.getElementsByTagName("English")[].childNodes[].nodeValue)
  29. student.getElementsByTagName("English")[].childNodes[].nodeValue =
  30.  
  31. f = open('new.xml', 'w', encoding = 'utf-8')
  32. dom.writexml(f,encoding = 'utf-8')
  33. f.close()

ElementTree

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

  1. '''
  2. Created on --
  3.  
  4. @author: salomon
  5. '''
  6. from xml.etree.ElementTree import ElementTree
  7.  
  8. tree = ElementTree()
  9. tree.parse("E:\\test.xml")
  10. root = tree.getroot()
  11. print(root.tag)
  12. print(root[].tag)
  13. print(root[].attrib)
  14. schools = root.getchildren()
  15. for school in schools:
  16. print(school.get("Name"))
  17. classes = school.findall("Class")
  18. for mclass in classes:
  19. print(mclass.items())
  20. print(mclass.keys())
  21. print(mclass.attrib["Id"])
  22. math = mclass.find("Student").find("Scores").find("Math")
  23. print(math.text)
  24. math.set("teacher", "bada")
  25.  
  26. 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存取XML方法简介的更多相关文章

  1. [转]Python存取XML方法简介

    转自:http://www.cnblogs.com/salomon/archive/2012/05/28/2518648.html 目前而言,Python 3.2存取XML有以下四种方法: 1.Exp ...

  2. python 存取xml方法

    或者也可以参考http://www.cnblogs.com/xiaowuyi/archive/2012/10/17/2727912.html中内容 目前而言,Python 3.2存取XML有以下四种方 ...

  3. Python和xml简介

    python提供越来越多的技术来支持xml,本文旨在面向初学利用Python处理xml的读者,以教程的形式介绍一些基本的xml出来概念.前提是读者必须知道一些xml常用术语. 先决条件 本文所有的例子 ...

  4. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

  5. Python 魔法方法简介

    1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一 ...

  6. Python Python-MySQLdb中的DictCursor使用方法简介

    Python-MySQLdb中的DictCursor使用方法简介 by:授客 QQ:1033553122     DictCursor的这个功能是继承于CursorDictRowsMixIn,这个Mi ...

  7. 列表[‘hello’ , ‘python’ ,’!’ ] 用多种方法拼接,并输出’hello python !’ 以及join()在python中的用法简介

    列表[‘hello’ , ‘python’ ,’!’ ] 用多种方法拼接,并输出’hello python !’ 使用字符串链接的四种方法都可以创建 字符串拼接一共有四种方法,也可以应用到列表的拼接中 ...

  8. Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)

    本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...

  9. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

随机推荐

  1. mysql取出现在的时间戳和时间时间戳转成人类看得懂的时间

    mysql取出现在的时间戳和时间时间戳转成人类看得懂的时间,我们在mysql里面他封装了一个内置的时间戳转化的函数,比如我们现在的时间戳是:1458536709 ,"%Y-%m-%d&quo ...

  2. SQL 中逻辑运算符的优先级

    三个逻辑运算符: NOT AND OR 它们的优先级依次降低(跟多数的高级程序设计语言的优先级顺序一致) 如果要提升某部分的优先级,可以使用半角括号实现 (这点也跟多数高级程序设计语言一致)

  3. 关于事件触发的一个小tips

    今天看到如下代码 window.globalEvent.bind('hotelHotTableRendered', function () { $('#hotelHotTd a').each(func ...

  4. 161027、Java 中的 12 大要素及其他因素

    对于许多人来说,"原生云"和"应用程序的12要素"是同义词.本文的目的是说有很多的原生云只坚持了最初的12个因素.在大多数情况下,Java 能胜任这一任务.在本 ...

  5. arduino 红外遥控器控制LED灯

    /* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件: 跳线公公头 * 5 led 220欧电阻 红外接收管,红外遥控 接线: 红外灯面向自己从左到右分别接 IO3 , ...

  6. linux下rm命令修改,增加回收站功能【笔记】

    一个脚本,linux的用户根目录下.bashrc最后加入如下代码,可以修改rm命令,让人们rm时候不再会全部删除,而是会加入到回收站里,以下是根据别人的资料参考修改的,不是原创 加入后,需要sourc ...

  7. Linux workqueue工作原理 【转】

    转自:http://blog.chinaunix.net/uid-21977330-id-3754719.html 转自:http://bgutech.blog.163.com/blog/static ...

  8. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  9. C# csv 操作类

    using System.Data; using System.IO; using System.Text; namespace YanZhiwei.DotNet2.Utilities.Common ...

  10. MySQL 添加列,修改列,删除列

    ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table ...