08 Python进阶:XML 解析

什么是 XML?

在这里插入图片描述

XML(可扩展标记语言,Extensible Markup Language)是一种用于表示和传输数据的标记语言。它被设计用来以一种结构化的形式描述文档的内容,并且具有良好的跨平台和跨语言的特性。XML使用标签来定义数据的结构,并可以通过自定义标签来适应各种不同的应用领域。

XML的主要特点包括:

  • 可扩展性:XML允许用户自定义标签,因此可以根据不同需求灵活扩展和定义数据结构。
  • 适应性:XML可以用于描述各种不同类型的数据,包括文本、图像、音频、视频等多媒体数据。
  • 平台无关性:XML是一种纯文本格式,不依赖于任何特定的硬件或软件平台。
  • 易于阅读和编写:XML文档使用标签进行结构化表示,使其易于人类阅读和编辑。
  • 广泛应用:XML在诸如Web服务(Web Services)、配置文件、数据交换等领域得到广泛应用。

通常,在XML中,数据以标签(tag)的形式包裹,并且可以使用属性(attributes)来提供更多的信息。下面是一个简单的XML示例:

<person><name>John Doe</name><age>30</age><gender>Male</gender>
</person>

这段XML描述了一个人员信息,包括姓名、年龄和性别。XML的灵活性和通用性使其成为数据交换、配置文件、Web服务等领域中常用的数据表示格式。

Python 对 XML 的解析方案

在这里插入图片描述

常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。

Python 有三种方法解析 XML:ElementTree、SAX 以及 DOM。

  1. ElementTree
    xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块,它提供了简单而高效的 API,用于解析和生成 XML 文档。

  2. SAX (simple API for XML )
    Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。

  3. DOM(Document Object Model)
    将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。

后面用到的实例文件:

<collection shelf="New Arrivals">
<movie title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description>
</movie><movie title="Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description>
</movie>
</collection>

Python 使用 ElementTree 解析 xml

xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块。

以下是 xml.etree.ElementTree 模块的一些关键概念和用法:

ElementTree 和 Element 对象:

  • ElementTree: ElementTree 类是 XML 文档的树形表示。它包含一个或多个 Element 对象,代表整个 XML 文档。
  • Element: Element 对象是 XML 文档中元素的表示。每个元素都有一个标签、一组属性和零个或多个子元素。

接下来,让我们分步进行解释:

解析 XML

首先,需要导入 ElementTree 模块,并使用 ET.parse() 方法加载 XML 文件。

本例中文件名为 example.xml

使用 ET.parse() 方法加载 XML 文件,并使用 getroot() 方法获取 XML 树的根元素 root

import xml.etree.ElementTree as ETtree = ET.parse('example.xml')
root = tree.getroot()

遍历 XML 树

要遍历 XML 树,可以使用循环来遍历子元素。每个元素都有标签名 (tag)、属性 (attrib) 和文本内容 (text)。

for movie in root.findall('movie'):title = movie.get('title')print(f"Movie title: {title}")description = movie.find('description').textprint(f"Description: {description}")format = movie.find('format').textprint(f"Format: {format}")

在上面的示例中,使用 findall('movie') 方法遍历所有 movie 元素。然后,我们使用 get('title') 获取电影的标题属性,以及 find('description').text 获取描述子元素的文本内容,以及格式等。

访问元素属性和文本

  • 使用 get('attr_name') 方法来访问元素的属性。
  • 使用 find('subelement') 方法来获取子元素,然后使用 .text 属性来获取子元素的文本内容。

创建 XML 元素

要创建新的 XML 元素,可以使用 ET.SubElement() 方法,并将其附加到父元素中。

new_movie = ET.SubElement(root, 'movie')
new_movie.set('title', 'New Movie Title')new_description = ET.SubElement(new_movie, 'description')
new_description.text = 'Exciting new movie'

上面的例子中,我们创建了一个新的 movie 元素,并设置了它的标题属性和描述子元素的文本内容。

修改和删除 XML 元素

要修改现有元素的属性或文本内容,只需直接对相应的属性进行赋值操作即可。要删除元素,可以使用 remove() 方法。

# 修改元素属性
movie.set('title', 'New Title')# 修改子元素文本内容
description.text = 'New description'# 删除元素
root.remove(movie)

简单读取 XML 内容:

import xml.etree.ElementTree as ET# 定义一个 XML 字符串
xml_string = '''
<bookstore><book><title>Introduction to Python</title><author>John Doe</author><price>29.99</price></book><book><title>Data Science with Python</title><author>Jane Smith</author><price>39.95</price></book>
</bookstore>
'''# 使用 ElementTree 解析 XML 字符串
root = ET.fromstring(xml_string)# 遍历 XML 树
for book in root.findall('book'):title = book.find('title').textauthor = book.find('author').textprice = book.find('price').textprint(f'Title: {title}, Author: {author}, Price: {price}')

以上代码执行输出结果为:

Title: Introduction to Python, Author: John Doe, Price: 29.99
Title: Data Science with Python, Author: Jane Smith, Price: 39.95

Python 使用 SAX 解析 xml

SAX 是一种基于事件驱动的API。

利用 SAX 解析 XML 文档牵涉到两个部分: 解析器和事件处理器。

解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。

而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。

  1. 对大型文件进行处理;
  2. 只需要文件的部分内容,或者只需从文件中得到特定信息。
  3. 想建立自己的对象模型的时候。

在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
ContentHandler 类方法介绍

使用xml.dom解析xml

ContentHandler 类是 Python 的 xml.sax 模块中定义的一个标准接口,用于处理 XML 文档的内容。下面是常用的 ContentHandler 类方法、参数和简要介绍,以及配合示例:

方法介绍与参数:

  1. startDocument()

    • 参数:无
    • 介绍:开始解析文档时调用,用于初始化解析状态。
def startDocument(self):print("Start parsing document")
  1. endDocument()

    • 参数:无
    • 介绍:结束解析文档时调用,用于清理解析过程中占用的资源。
def endDocument(self):print("End parsing document")
  1. startElement(tag, attributes)

    • 参数:tag 表示元素标签名,attributes 是一个字典类型,包含了元素的属性。
    • 介绍:遇到 XML 元素的开始标签时调用,用于处理元素的开始部分。
def startElement(self, tag, attributes):print(f"Start element: {tag}")if attributes:print("Attributes:", attributes)
  1. endElement(tag)

    • 参数:tag 表示元素标签名。
    • 介绍:遇到 XML 元素的结束标签时调用,用于处理元素的结束部分。
def endElement(self, tag):print(f"End element: {tag}")
  1. characters(content)

    • 参数:content 是元素内的字符数据(文本内容)。
    • 介绍:用于处理元素内的字符数据。
def characters(self, content):print("Character data:", content)

make_parser, parserparseString 都是与 XML 解析相关的函数或类,通常用于解析和处理 XML 数据。下面是它们的简要介绍:

  1. xml.sax.make_parser()

    • xml.sax.make_parser() 函数用于创建并返回一个新的 SAX 解析器对象。
    • 示例:
      import xml.sax
      parser = xml.sax.make_parser()
      
  2. parser

    • parser 是由 xml.sax.make_parser() 创建的 SAX 解析器对象。它可以通过调用其他方法和设置内容处理器来实现 XML 数据的解析和处理。
    • 示例:
      parser.setFeature(xml.sax.handler.feature_namespaces, 0)
      
  3. parseString()

    • 在针对 XML 字符串进行解析时使用的方法。它是 xml.sax 模块中 xml.sax.parseString() 的同义词。
    • 示例:
      xml_string = "<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"
      parser = xml.sax.make_parser()
      handler = MyContentHandler()
      parser.setContentHandler(handler)
      parser.parseString(xml_string)
      

这些函数和方法都是 xml.sax 模块中用于解析 XML 的一部分。通过使用它们,可以有效地处理和操作 XML 数据。

示例代码:

import xml.saxclass MyContentHandler(xml.sax.ContentHandler):def startDocument(self):print("Start parsing document")def endDocument(self):print("End parsing document")def startElement(self, tag, attributes):print(f"Start element: {tag}")if attributes:print("Attributes:", attributes)def endElement(self, tag):print(f"End element: {tag}")def characters(self, content):print("Character data:", content)# 创建 XML 解析器对象
parser = xml.sax.make_parser()
# 关闭命名空间处理
parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 设置内容处理器
content_handler = MyContentHandler()
parser.setContentHandler(content_handler)# 解析 XML 文件
xml_file = "example.xml"
with open(xml_file, "r") as file:parser.parse(file)

以上示例展示了如何创建一个自定义的 ContentHandlerMyContentHandler 并使用它来解析 XML 文件。在这个例子中,我们重写了 startDocument()endDocument()startElement()endElement()characters() 方法来处理不同类型的事件和内容。

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

#!/usr/bin/python3from xml.dom.minidom import parse
import xml.dom.minidom# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):print ("Root element : %s" % collection.getAttribute("shelf"))# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息
for movie in movies:print ("*****Movie*****")if movie.hasAttribute("title"):print ("Title: %s" % movie.getAttribute("title"))type = movie.getElementsByTagName('type')[0]print ("Type: %s" % type.childNodes[0].data)format = movie.getElementsByTagName('format')[0]print ("Format: %s" % format.childNodes[0].data)rating = movie.getElementsByTagName('rating')[0]print ("Rating: %s" % rating.childNodes[0].data)description = movie.getElementsByTagName('description')[0]print ("Description: %s" % description.childNodes[0].data)

结果:

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费https详细教程

简单叙述一下https的定义和实现https的一些基本作用&#xff0c;然后会给到申请SSL证书的方式以及安装部署流程&#xff0c;最终实现网站的https访问。 随着互联网的快速发展&#xff0c;网络安全问题日益凸显。在互联网上传输敏感信息、进行在线交易和共享个人数据时&#xf…

Spring boot微服务分布式框架Rouyi Cloud权限认证

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

Go 程序的启动流程【1/2】

Go 程序的启动流程 本文将以一个简单的 HelloWorld 程序为例&#xff0c;探究 Go 程序的启动流程 package mainfunc main() {_ "Hello World" }入口 我们先通过 go build . 将代码编译成可执行文件&#xff0c;众所周知&#xff0c;我们在一个 shell 中执行可执行…

CLoVe:在对比视觉语言模型中编码组合语言

CLoVe:在对比视觉语言模型中编码组合语言 摘要引言相关工作CLoVe: A Framework to Increase Compositionality in Contrastive VLMsSynthetic CaptionsHard NegativesModel Patching CLoVe: Encoding Compositional Language inContrastive Vision-Language Models 摘要 近年来…

记一次安服薅洞实战

记一次为数不多但还算有点收获的一次实战&#xff08;平时摸鱼来着...&#xff09;&#xff0c;大致任务是对某某市某*院进行次漏洞收集和外网资产梳理且是有授权的&#xff08;其实是甲方不大清楚自己外网有多少资产&#xff09;&#xff0c;漏洞质量要求还挺高。emmm本来是打…

大米自动化生产线设备:现代粮食加工的核心力量

随着科技的不断进步和粮食加工行业的快速发展&#xff0c;大米自动化生产线设备在现代粮食加工中的地位愈发重要。这些设备不仅大大提高了生产效率&#xff0c;还保证了产品的质量和安全&#xff0c;成为了现代粮食加工行业不可或缺的核心力量。 一、自动化生产线设备助力效率提…

【面试经典150 | 动态规划】交错字符串

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

一些Java面试题

1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、面向对象和…

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/inception-v1

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/ inception-v1 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet GoogleNet问题 在VGGNet简单堆…

(2024)Ubuntu源码安装多个版本的opencv并切换使用

本人工作会用到x86_64的opencv和aarch64的opencv&#xff0c;所以写下来备忘自用 一、源码编译安装 依赖库安装&#xff1a; sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev o…

卷积神经网络实战

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 1.首先读取数据 - 分别构建训练集和测试集&#xff08;验证集&#xff09; - DataLoader来迭代取数据 # 定义超参数 input_size 28 #图像的总尺寸28*28…

【代码】二分法求最小值

仅适用于以下情况&#xff1a;区间内单调或者最多一个极小值 代码 以[0,pi]内的三角函数为例 clc clear close allx0:pi/1000:pi; ytest(x); figure() plot(x,y,.)cutnum100;x1x(1); x2x(end); error_max10^-1000;%能接受的误差上限 for i1:cutnum%这里cutnum是取值上限num(…

电池二次利用走向可持续大循环周期的潜力和挑战(第一篇)

一、背景 当前&#xff0c;气候变化是全球可持续发展面临的重大挑战。缓解气候变化最具挑战性的目标是在本世纪中期实现碳中和&#xff08;排放量低到足以被自然系统安全吸收&#xff09;&#xff0c;其中电动汽车&#xff08;EV&#xff09;的引入是一项关键举措。电动汽车在…

对代理模式的理解

目录 一、前言二、案例1 代码2 自定义代理类【静态代理】2.1 一个接口多个实现&#xff0c;到底注入哪个依赖呢&#xff1f;2.1.1 Primary注解2.1.2 Resource注解&#xff08;指定name属性&#xff09;2.1.3 Qualifier注解 2.2 面向接口编程2.3 如果没接口咋办呢&#xff1f;2.…

阿里巴巴中国站获得1688商品详情 API:如何通过API接口批量获取价格、标题、图片、库存等数据

在数字化时代&#xff0c;数据的重要性不言而喻。对于电商从业者来说&#xff0c;获取商品详情数据是提升业务效率和用户体验的关键。阿里巴巴中国站作为电商行业的巨头&#xff0c;提供了丰富的API接口&#xff0c;方便开发者们批量获取商品信息。本文将详细叙述如何通过阿里巴…

C语言——详解字符函数和字符串函数(二)

Hi,铁子们好呀&#xff01;之前博主给大家简单地介绍了部分字符和字符串函数&#xff0c;那么这次&#xff0c;博主将会把这些字符串函数给大家依次讲完&#xff01; 今天讲的具体内容如下: 文章目录 6.strcmp函数的使用及模拟实现6.1 strcmp函数介绍和基本使用6.1.1 strcmp函…

总结:微信小程序中跨组件的通信、状态管理的方案

在微信小程序中实现跨组件通信和状态管理,有以下几种主要方案: 事件机制 通过事件机制可以实现父子组件、兄弟组件的通信。 示例: 父组件向子组件传递数据: 父组件: <child binddata"handleChildData" /> 子组件: Component({..., methods: { handleChildData(…

Linux网卡与IP地址:通往网络世界的通行证

在探索Linux网卡和IP地址的关系之前&#xff0c;我们得先理解Linux网卡是怎么工作的。想象一下&#xff0c;每台计算机都是一个世界&#x1f30e;&#xff0c;而网卡就是连接这些世界的门户&#x1f6aa;。网卡的工作就是接收和发送数据包&#xff0c;就像邮差&#x1f4ec;递送…

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…

洛谷 1126.机器人搬重物

思路&#xff1a;BFS 这道BFS可谓是细节爆炸&#xff0c;对于编程能力和判断条件的能力的考察非常之大。 对于这道题&#xff0c;我们还需要额外考虑一些因素&#xff0c;那就是对于障碍物的考虑和机器人方位的考虑。 首先我们看第一个问题&#xff0c;就是对于障碍物的考虑…