首页 > 编程语言 >python之xml基本操作

python之xml基本操作

时间:2022-12-30 10:11:31浏览次数:39  
标签:xml name python gender self et 基本操作 age

1. 概述

XML(Extensible Markup Language)中文译为可扩展标记语言,它是一种简单、灵活、易扩展的文本格式,它主要关注数据内容,常用来传送、存储数据。

当通过 XML 来传送数据时,自然会涉及到 XML 的解析工作,通常 Python 可以通过如下三种方式来解析 XML:

DOM
DOM 方式会将整个 XML 读入内存,在内存中解析成一个树,通过对树的操作来操作 XML,该方式占用内存较大,解析速度较慢。

SAX
SAX 方式逐行扫描 XML 文档,边扫描边解析,占用内存较小,速度较快,缺点是不能像 DOM 方式那样长期留驻在内存,数据不是长久的,事件过后,若没保存数据,数据会丢失。

ElementTree
ElementTree 方式几乎兼具了 DOM 方式与 SAX 方式的优点,占用内存较小、速度较快、使用也较为简单。

2. 写入

首先,通过 Python 创建一个 XML 文档并向其中写入一些数据,实现代码如下所示:

from xml.etree import ElementTree as et
import xml.dom.minidom as minidom

# 创建根节点 
root = et.Element('school')
names = ['张三', '李四']
genders = ['男', '女']
ages = ['20', '18']
# 添加子节点
student1 = et.SubElement(root, 'student')
student2 = et.SubElement(root, 'student')
et.SubElement(student1, 'name').text = names[0]
et.SubElement(student1, 'gender').text = genders[0]
et.SubElement(student1, 'age').text = ages[0]
et.SubElement(student2, 'name').text = names[1]
et.SubElement(student2, 'gender').text = genders[1]
et.SubElement(student2, 'age').text = ages[1]
# 将根目录转化为树行结构
tree = et.ElementTree(root)
rough_str = et.tostring(root, 'utf-8')
# 格式化
reparsed = minidom.parseString(rough_str)
new_str = reparsed.toprettyxml(indent='\t')
f = open('test.xml', 'w', encoding='utf-8')
# 保存
f.write(new_str)
f.close()

看一下效果:


   

3. 解析

我们分别使用 DOM、SAX、ElementTree 方式解析上面生成的 XML 文件。

3.1 DOM 方式

看一下如何通过 DOM 方式进行解析,实现代码如下所示:

from xml.dom.minidom import parse

# 读取文件
dom = parse('test.xml')
# 获取文档元素对象
elem = dom.documentElement
# 获取 student
stus = elem.getElementsByTagName('student')
for stu in stus:
    # 获取标签中内容
    name = stu.getElementsByTagName('name')[0].childNodes[0].nodeValue
    gender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValue
    age = stu.getElementsByTagName('age')[0].childNodes[0].nodeValue
    print('name:', name, ', gender:', gender, ', age:', age)

执行结果:

name: 张三 , gender: 男 , age: 20
name: 李四 , gender: 女 , age: 18

3.2 SAX 方式

看一下如何通过 SAX 方式进行解析,实现代码如下所示:

import xml.sax

class StudentHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.name = ''
        self.age = ''
        self.gender = ''

    # 元素开始调用
    def startElement(self, tag, attributes):
        self.CurrentData = tag

    # 元素结束调用
    def endElement(self, tag):
        if self.CurrentData == 'name':
            print('name:', self.name)
        elif self.CurrentData == 'gender':
            print('gender:', self.gender)
        elif self.CurrentData == 'age':
            print('age:', self.age)
        self.CurrentData = ''

    # 读取字符时调用
    def characters(self, content):
        if self.CurrentData == 'name':
            self.name = content
        elif self.CurrentData ==  'gender':
            self.gender = content
        elif self.CurrentData ==  'age':
            self.age = content

if (__name__ == "__main__"):
    # 创建 XMLReader
    parser = xml.sax.make_parser()
    # 关闭命名空间
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    # 重写 ContextHandler
    Handler = StudentHandler()
    parser.setContentHandler(Handler)
    parser.parse('test.xml')

执行结果:

name: 张三
gender: 男
age: 20
name: 李四
gender: 女
age: 18

3.3 ElementTree 方式

看一下如何通过 ElementTree 方式进行解析,实现代码如下所示:

import xml.etree.ElementTree as et

tree = et.parse('test.xml')
# 根节点
root = tree.getroot()
for stu in root:
    print('name:', stu[0].text, ', gender:', stu[1].text, ', age:', stu[2].text)

执行结果:

name: 张三 , gender: 男 , age: 20
name: 李四 , gender: 女 , age: 18


作者:秣禾
链接:https://www.jianshu.com/p/3085258e3b1c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:xml,name,python,gender,self,et,基本操作,age
From: https://www.cnblogs.com/kn-zheng/p/17014171.html

相关文章

  • 浅析Python 实现一个自动化翻译和替换的工具
    浅析Python实现一个自动化翻译和替换的工具大家好我是毕加锁(锁!)这篇文章主要介绍了Python实现一个自动化翻译和替换的工具,非常不错,具有一定的参考借鉴价值,需要的朋友......
  • Python处理复杂的CSV文件
    目录​​大家好我是毕加索锁(锁!)今天教大家利用Python处理复杂的CSV文件​​​​项目简介​​​​项目笔记与心得​​​​总结​​ 大家好我是毕加索锁(锁!)今天教大家......
  • 利用Python制作本地Excel的查询与生成的程序
    目录​​前言​​​​需求​​​​实验步骤​​​​Excel预览图片​​​​查询​​​​追加查询结果到Excel​​​​完整代码​​前言大家好我是毕加锁(锁!)今天教大家利......
  • 锦囊秘籍!用Python操作MySQL的使用教程集锦!
    一.python操作数据库介绍大家好,我是毕加锁(锁!)。Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的......
  • Python实现房产数据分析与可视化 数据分析 实战
    Python库的选择话说,工欲善其事,必先利其器,虽然我们已经选择Python来完成剩余的工作,但是我们需要考虑具体选择使用Pytho的哪些利器来帮助我们更快更好地完成剩余的工作。我们......
  • 11个案例讲透 Python 函数参数
    今天给大家分享一下自己整理的一篇Python参数的内容,内容非常的干,全文通过案例的形式来理解知识点,自认为比网上80%的文章讲的都要明白,如果你是入门不久的python新手,相......
  • 运用Python分析公募基金【量化投资】
    运用Python分析公募基金1、背景学校财富管理课程的期末论文是分析中国各种投资标的的收益,笔者分配到的研究的细分类别为:通过大集合转公募基金的方式,成立的公募基金的收益分......
  • Python处理Excel比Vba快100倍,媳妇连连夸赞今晚不用再跪搓衣板----python实战
    最近经历了一次把vb脚本改造成python脚本,并获得性能提升数倍的过程,当然,这个过程也不是一帆风顺,中间也经历了一些波折,但是,也收获了一波新的认知。正好最近有时间,姑且写下来记......
  • Python办公自动化|批量生成请假条
    大家好,我是毕加锁本文就将基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word,主要将涉及以下三个知识点​​openpyxl​​ 读取Excel文件​​python-docx​​ ......
  • 利用Python制作第一人称射击小游戏 含源代码
    大家好我是毕加锁(锁!)今天教大家利用Python制作第一人称小游戏 涉及知识点1.sprites2.pygame混音器3.图章  4.python基础语法.代码1发射声fromspritesimport*......