Python 解析 XML
xsobi 2024-11-24 23:35 17 浏览
1 简介
XML 全称 Extensible Markup Language,中文译为可扩展标记语言。XML 之前有两个先行者:SGML 和 HTML,率先登场的是 SGML, 尽管它功能强大,但文档结构复杂,既不容易学也不易于使用,因此几个主要的浏览器厂商均拒绝支持 SGML,这些因素限制了 SGML 在网上的传播性;1989 年 HTML 登场,它继承了 SGML 诸多优点,去除了 SGML 复杂庞大的缺点,HTML 在数据显示上表现十分出色,但它的语法是不可扩展的,因此其无法描述数据、可读性差,没办法人们再次将目光转向 SGML,经过对 SGML 一系列改造,终于在 1998 年,XML 第一个版本问世。
上面说了那么多,简单来说就是:XML 和 HTML 均由 SGML 改造而来,HTML 是一种页面技术,聚焦的是数据的显示,而 XML 易于扩展,主要用来传送和存储数据,聚焦的是数据的内容。
2 解析
2.1 解析方式
Python 有三种 XML 解析方式:SAX(simple API for XML)、DOM(Document Object Model)、ElementTree。
- DOM 方式:DOM 中文译为文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。
- SAX 方式:SAX 是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析,对于大型文档的解析拥有巨大优势,尽管不是 W3C 标准,但它却得到了广泛认可。
- ElementTree 方式:ElementTree 相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。
2.2 具体实现
在具体解析之前我们先准备一个 XML,如下所示:
test.xml
<?xml version="1.0" encoding="utf-8"?>
<list>
<student id="stu1" name="stu">
<id>1001</id>
<name>张三</name>
<age>22</age>
<gender>男</gender>
</student>
<student id="stu2" name="stu">
<id>1002</id>
<name>李四</name>
<age>21</age>
<gender>女</gender>
</student>
</list>
DOM 方式解析
使用 DOM 方式,首先要对其 API 有一定了解,如果不了解,网上的教程也比较多,比如:DOM 教程,下面看一下使用示例。
from xml.dom.minidom import parse
# 读取文件
dom = parse('test.xml')
# 获取文档元素对象
data = dom.documentElement
# 获取 student
stus = data.getElementsByTagName('student')
for stu in stus:
# 获取标签属性值
st_id = stu.getAttribute('id')
st_name = stu.getAttribute('name')
# 获取标签中内容
id = stu.getElementsByTagName('id')[0].childNodes[0].nodeValue
name = stu.getElementsByTagName('name')[0].childNodes[0].nodeValue
age = stu.getElementsByTagName('age')[0].childNodes[0].nodeValue
gender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValue
print('st_id:', st_id, ', st_name:',st_name)
print('id:', id, ', name:', name, ', age:', age, ', gender:',gender)
输出结果:
st_id: stu1 , st_name: stu
id: 1001 , name: 张三 , age: 22 , gender: 男
st_id: stu2 , st_name: stu
id: 1002 , name: 李四 , age: 21 , gender: 女
通过输出结果,我们可以发现已经获取了标签属性值和标签内容了。
SAX 方式解析
使用 SAX 解析 XML 文档主要涉及到解析器和事件处理器,解析器负责读取 XML 文档,并向事件处理器发送事件,事件处理器负责对事件作出响应,对传递的 XML 数据进行处理。
Python 使用 SAX 处理 XML 需要用到 xml.sax 中的 parse 函数和 xml.sax.handler 中的 ContentHandler 类,下面看一下 ContentHandler 类中的一些方法。
- characters(content):调用时机:从行开始,遇到标签之前,存在字符,content 的值为这些字符串;从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串;从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
- startDocument():文档启动的时候调用。
- endDocument():解析器到达文档结尾时调用。
- startElement(name, attrs):遇到 XML 开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。
- endElement(name):遇到 XML 结束标签时调用。
下面通过示例看一下如何通过 SAX 方式解析 XML。
import xml.sax
class StudentHandler(xml.sax.ContentHandler):
def __init__(self):
self.id = ""
self.name = ""
self.age = ""
self.gender = ""
# 元素开始调用
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "student":
stu_name = attributes["name"]
print("stu_name:", stu_name)
# 元素结束调用
def endElement(self, tag):
if self.CurrentData == "id":
print("id:", self.id)
elif self.CurrentData == "name":
print("name:", self.name)
elif self.CurrentData == "age":
print("age:", self.age)
elif self.CurrentData == "gender":
print("gender:", self.gender)
self.CurrentData = ""
# 读取字符时调用
def characters(self, content):
if self.CurrentData == "id":
self.id = content
elif self.CurrentData == "name":
self.name = content
elif self.CurrentData == "age":
self.age = content
elif self.CurrentData == "gender":
self.gender = 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")
输出结果:
stu_name: stu
id: 1001
name: 张三
age: 22
gender: 男
stu_name: stu
id: 1002
name: 李四
age: 21
gender: 女
ElementTree 方式解析
Python 提供了两种 ElementTree 的实现方式。一个是纯 Python 实现的 xml.etree.ElementTree,另一个是 C 语言实现 xml.etree.cElementTree,使用 C 语言实现的方式速度更快且内存消耗更少。Python3.3 之后,ElemenTree 模块会自动优先使用 C 加速器,如果不存在 C 实现,则会使用 Python 实现。因此,使用 Python3.3+ 时,只需要 import xml.etree.ElementTree 即可。下面看一下示例。
import xml.etree.ElementTree as ET
tree = ET.parse("test.xml")
# 根节点
root = tree.getroot()
# 标签名
print('root_tag:',root.tag)
for stu in root:
# 属性值
print ("stu_name:", stu.attrib["name"])
# 标签中内容
print ("id:", stu[0].text)
print ("name:", stu[1].text)
print("age:", stu[2].text)
print("gender:", stu[3].text)
输出结果:
root_tag: list
stu_name: stu
id: 1001
name: 张三
age: 22
gender: 男
stu_name: stu
id: 1002
name: 李四
age: 21
gender: 女
总结
本文介绍和演示了 Python 三种 XML 解析方式,对 Python 工程师使用 Python 解析 XML 提供了支撑。
相关推荐
- 在 Linux 系统中安装 Redis 的详细步骤
-
以下是在Linux系统中安装Redis的详细步骤,支持通过包管理器安装(简单快捷)和源码编译安装(获取最新版本)两种方式:方法1:使用包管理器安装(推荐新手)适用于Ubuntu/De...
- 在Linux系统上安装Redis集群的详细步骤
-
以下是在Linux系统上安装Redis集群的详细步骤,基于Redis6.x+版本,采用三主三从(6个节点)的典型配置模式:1.安装前准备环境要求系统:Ubuntu/CentOS等主流Linux发行...
- Linux入门使用教程
-
Linux入门一、初始化配置CentOS初始化安装在开始熟悉Linux操作命令之前,我们必须先搭建好Linux操作系统环境,我们这里选用的是Linux的发行版本CentOS7,在安装好CentOS操作...
- 06新手学习:Linux入门级命令教程
-
1、开启终端问题:什么是终端(Terminal)答:Linux操作系统中用于输入命令的位置打开后,效果如下图所示:2、Linux命令格式什么是Linux的命令?答:就是指在Linux终端(命令行)...
- 【笔记】windows10安装linux双系统教程(可能是现今最简单方法)
-
这周测试成功了大牛漂移菌教的树莓派系统镜像的压缩方法(【树莓派】小空间树莓派镜像系统备份方法img镜像文件压缩方法),虚拟机下备份镜像不太方便,无论是存储空间还是读卡操作都不方便。所以打算装个linu...
- 网络安全工程师:小白是如何让Kali Linux操作系统从U盘成功启动
-
一、背景介绍作为一名渗透测试工作人员(或者小白),在我们的日常工作或者学习中,我们不可能时时刻刻将自己的个人电脑(安装好KaliLinux的个人主机)带在身边,当我们没有带自己的个人电脑而需要进行渗...
- Linux配置ip地址的两种方法
-
Linux配置ip地址的两种方法,实验环境为centos7.6方法1:nmcli工具配置(centos7以下版本不支持该方法)第一步,通过nmcliconnection查看网卡名称[root@lo...
- Linux man 命令使用教程
-
简介man=manual(手册)命令用来查看Linux系统命令、函数、配置文件、系统调用等的官方文档。几乎所有标准程序和工具都有对应的man手册。基本语法man[options][s...
- Linux程序安装与管理指南
-
在Linux系统中,安装和管理程序主要通过包管理器和手动编译安装两种主要方式实现。以下是详细的操作指南,涵盖常见发行版(如Ubuntu/Debian、CentOS/RHEL、Fedora等)的用法。一...
- 零基础保姆级教程!手把手教你免费玩转Linux安装+学习环境搭建!
-
前期准备安装VMware虚拟机首先你要安装VMware虚拟机,如果你还不知道VMware是什么可以去看我的VMware相关教程,里面有详细解答检查V-CPU虚拟化是否开启当我们在虚拟机安装系统的...
- 网络安全工程师:小白如何使用Kali Linux生成木马后门并实现免沙
-
1.背景介绍msfvenom是msfpayload和msfencode的结合体,可利用msfvenom生成木马程序,并在目标机上执行,在本地监听上线,在黑客圈子,这款工具略有名气。本次教程是Msfve...
- Linux详解系列一:如何安装系统及客户端工具的使用
-
Linux是一种开放源码的操作系统,和Windows不同的是,由于其具有开源,稳定性强,安全,多用户操作等特点,它的使用场景非常广泛,比如企业中所使用的服务器中的操作系统,以及移动端的Andr...
- 4种方案供你选,微软发布《如何下载和安装Linux》教程
-
IT之家10月14日消息,微软近日发布了一个教程指南《如何下载和安装Linux》,介绍了使用WSL、本地安装、本地虚拟机和云端虚拟机4种方案。该指南重点介绍了用户在PC上运行Li...
- 嵌入式Linux开发教程:Linux Shell
-
本章重点介绍Linux的常用操作和命令。在介绍命令之前,先对Linux的Shell进行了简单介绍,然后按照大多数用户的使用习惯,对各种操作和相关命令进行了分类介绍。对相关命令的介绍都力求通俗易懂,都给...
- Linux基础手把手教学:使用22.04系统
-
Linux基础手把手教学:使用Ubuntu22.04系统。1.这节来讲一下下边的目录结构,因为只有清楚了解linux下边的目录结构,才能很方便地进行操作。linux下边的目录结构较为简单...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)