首页 > 编程 > Python > 正文

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

2020-02-23 04:26:28
字体:
来源:转载
供稿:网友

本文实例讲述了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 minidomdom = 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 = 75f = open('new.xml', 'w', encoding = 'utf-8')dom.writexml(f,encoding = 'utf-8')f.close()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表