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

发布时间 - 2026-01-11 00:17:13    点击率:

本文实例讲述了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的整体效率。

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线XML/JSON互相转换工具:
http://tools./code/xmljson

在线格式化XML/在线压缩XML
http://tools./code/xmlformat

XML在线压缩/格式化工具:
http://tools./code/xml_format_compress

XML代码在线格式化美化工具:
http://tools./code/xmlcodeformat

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python操作xml数据技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。


# Python  # 存取  # XML  # Python创建xml的方法  # 使用PYTHON创建XML文档  # 使用Python生成XML的方法实例  # Python处理XML格式数据的方法详解  # python解析基于xml格式的日志文件  # 用Python解析XML的几种常见方法的介绍  # Python 解析XML文件  # Python lxml模块安装教程  # Python获取任意xml节点值的方法  # Python使用minidom读写xml的方法  # 详细解读Python中解析XML数据的方法  # Python创建xml文件示例  # 文档  # 两种  # 的是  # 是一个  # 中有  # 感兴趣  # 子树  # 该文件  # 回调  # 拉出  # 进阶  # 操作技巧  # 串流  # 是个  # 是一种  # 放在  # 相关内容  # 多个  # 不需要  # 是由 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python文本处理实践_日志清洗解析【指导】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  linux top下的 minerd 木马清除方法  Linux系统命令中tree命令详解  如何快速搭建高效可靠的建站解决方案?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  高端企业智能建站程序:SEO优化与响应式模板定制开发  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  公司网站制作价格怎么算,公司办个官网需要多少钱?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Bootstrap CSS布局之列表  如何在VPS电脑上快速搭建网站?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  太平洋网站制作公司,网络用语太平洋是什么意思?  iOS中将个别页面强制横屏其他页面竖屏  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何快速生成可下载的建站源码工具?  EditPlus中的正则表达式 实战(4)  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  公司门户网站制作流程,华为官网怎么做?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  利用vue写todolist单页应用  如何在万网自助建站中设置域名及备案?  如何在IIS中新建站点并解决端口绑定冲突?  中山网站制作网页,中山新生登记系统登记流程?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何为不同团队 ID 动态生成多个非值班状态按钮  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel如何生成URL和重定向?(路由助手函数)  Windows Hello人脸识别突然无法使用  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何为不同团队 ID 动态生成多个“认领值班”按钮  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  大同网页,大同瑞慈医院官网?  Laravel集合Collection怎么用_Laravel集合常用函数详解  网站建设整体流程解析,建站其实很容易!